awk 还是 grep? - 打印关键字和后续列

awk 还是 grep? - 打印关键字和后续列

我做了一些基准测试,输出是一个包含多个结果的单个文件,格式如下

[blaaa]
1st run

T/V   N  NB  P  Q   Time
==========================
2     3   4  1  2   1.02
[blaaaa...]
2nd run
T/V   N  NB  P  Q   Time
==========================
4     42 4  1  2    1.22

我只想获取我所做的不同运行的运行时间。那么是否可以 grep “Time” 并打印下一列?或者甚至只打印出来

1.02
1.22

对于我上面的例子?我更喜欢只打印三个结果列,而不打印 blaa 部分:D

答案1

假设Time总是在第六个字段:

$ awk '$6 == "Time" {t = NR} t && NR == t+2 {print $6}' file
1.02
1.22

或者你可以使用getline两次 - fast'n'dirty:

awk '$6 == "Time" {getline; getline; print $6}' file

(“脏”是因为它不检查getline返回值)。

答案2

$ grep -o 'Time\|[0-9\.]\+$' file
Time
1.02
Time
1.22
$ grep -o '[0-9\.]\+$' file
1.02
1.22
$ grep -A2 ^T/V file
T/V   N  NB  P  Q   Time
==========================
2     3   4  1  2   1.02
--
T/V   N  NB  P  Q   Time
==========================
4     42 4  1  2    1.22

结果在最后一个 grep 中用 分隔--,可以使用以下命令删除:

$ grep -A2 ^T/V file | grep -v '^--'

删除这些====行后:

$ grep -A2 ^T/V file | grep -v '^--\|=\+'

答案3

您使用 得到了两个答案awk and grep,您也可以尝试sed

sed -E '/===*/{N;s/.*([0-9]+\.[0-9]*)/\1/g};t;d' file_name

这里/===*/, 将匹配===..,然后它将转到下一行并查找它们之间有小数的浮点数,并跳过并删除所有其他行。

它将打印如下输出:

1.02
1.22

相关内容