【问题标题】:"grep"ing first 12 of last 24 character from a line“grep”一行中最后 24 个字符的前 12 个
【发布时间】:2013-08-02 18:33:07
【问题描述】:

我正在尝试从一行中提取“后 24 个字符中的前 12 个”,即 一行:

species,subl,cmp=    1    4    1    s1,torque= 0.41207E-09-0.45586E-13

我需要提取“0.41207E-0”。 (代码我没写,别骂我格式。)

我已经通过以下方式做到了:

  var_s=`grep "species,subl,cmp=    $3    $4    $5" $tfile |sed -n '$s/.*\(........................\)$/\1/p'|sed -n '$s/\(............\).*$/\1/p'`

但是,有没有更易读的方法来做这件事,而不是计算点?

编辑 感谢你们俩; 所以,我有 sed、awk grep 和 bash。 我将循环运行它,用于 100 个文件。 那么,您能否建议我哪一个最有效?

【问题讨论】:

  • 没有进行任何基准测试,但我倾向于认为纯 bash 解决方案应该是最快的,因为它不调用任何外部二进制文件。
  • 不要预先优化。只有在速度成为问题时才优化。最好的解决方案是您最了解并感觉最舒适的扩展自己的解决方案。

标签: shell sed awk grep


【解决方案1】:

GNU sed 的一种方式(不计算点)

$ sed -r 's/.*(.{11}).{12}/\1/' file
0.41207E-09

GNU grep类似:

$ grep -Po '.{11}(?=.{12}$)' file
0.41207E-09

也许python 解决方案也可能会有所帮助:

python -c 'import sys;print "\n".join([a[-24:-13] for a in sys.stdin])' < file
0.41207E-09

我不确定您的示例数据和问题是否匹配,因此只需相应地更改 {n} 量词中的值即可。

【讨论】:

  • +1 获得 3 个有趣的选项。请注意,在 OSX 上将 sed -r 替换为 sed -E
  • @anubhava 您可能对GNU sed 的这个未记录的功能感兴趣,-E-r 的别名,不幸的是,情况并非如此。
  • 哦,是的,我是在上个月使用home brew在我的 OSX 上安装 gnu sed 后才知道的
  • 感谢 GREP 解决方案!它为我节省了大量带有 Base64 编码图像的日志列表。
【解决方案2】:

最简单的是使用纯 bash:

echo "${str:(-24):12}"

OR awk 也可以这样做:

awk '{print substr($0, length($0)-23, 12)}' <<< $str

输出:

0.41207E-09

编辑:对于文件使用 bash 解决方案:

while read l; do echo "${l:(-24):12}"; done < file

【讨论】:

  • +1 对于bash 解决方案,展示如何扩展它对文件的使用会很有用。
  • @sudo_O:谢谢,使用它文件我猜 bash 解决方案需要一个 while 循环。 (可以在 sed、grep、awk 等中避免)
【解决方案3】:

另一种,效率较低,但具有让您发现新工具的优势

`echo "$str" | rev | cut -b 1-24 | rev | cut -b 1-12

【讨论】:

    【解决方案4】:

    您可以使用 awk 从一行中获取后 24 个字符的前 12 个字符:

    awk '{substr($0,(length($0)-23))};{print substr($0,(length($0)-10))}' myfile.txt
    

    【讨论】:

    • 您可以在一次调用awk 中轻松完成此操作;将awk 的输出通过管道传输到另一个awk 是一种浪费。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    相关资源
    最近更新 更多