3

我正在尝试从一行中提取“最后 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 个文件。那么,你能建议我哪一个是最有效的吗?

4

4 回答 4

7

一种方法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}量词中的值。

于 2013-08-02T18:36:14.577 回答
4

最简单的是使用纯 bash:

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

或者 awk 也可以这样做:

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

输出:

0.41207E-09

编辑:在文件上使用 bash 解决方案:

while read l; do echo "${l:(-24):12}"; done < file
于 2013-08-02T18:37:10.717 回答
2

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

`echo "$str" | rev | cut -b 1-24 | rev | cut -b 1-12
于 2013-08-02T19:02:42.820 回答
0

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

awk '{substr($0,(length($0)-23))};{print substr($0,(length($0)-10))}' myfile.txt
于 2013-08-20T15:55:38.597 回答