使用AWK递归查找

时间:2013-08-10 16:26:29

标签: bash shell awk pattern-matching

我有一个看起来像这样的文件:

$cat myfile.dat

Number of reps:     nrep=  19230
flop count:         nops=  4725964800.

Clock resolution is  4.7619047619047619E-4 , usecs
time =  7.18247611075639725E-6
calc      0: time=    2.902 Gflop/s=    1.629 error=         0.00000000
calc    201: time=    1.186 Gflop/s=    3.985 error=         0.00000000
Number of reps:     nrep=  13456
flop count:         nops=  4234564800.

Clock resolution is  3.7619047619047619E-4 , usecs
time =  7.18247611075639725E-6
calc      0: time=    1.232 Gflop/s=    2.456  error=         0.00000000
calc    201: time=    3.186 Gflop/s=    1.345  error=         0.00000000

我有兴趣过滤我需要的内容:nreptimeGflop/s,但这只是以calc 201开头的最后两行。

到目前为止,我已成功过滤了我想要的内容,但元素timeGflop/s除外。这就是我所做的:

awk -F'= ?' '/nrep=/||/time=/||/Gflop/{print $2}' myfile.dat

19230
2.902 Gflop/s
1.186 Gflop/s
13456
1.232 Gflop/s
3.186 Gflop/s

这显然是错误的。我需要的,理想情况是在列中而不是:

19230 1.186 3.985
13456 3.186 1.345

有没有合理的方法呢?

3 个答案:

答案 0 :(得分:4)

使用GNU awk您只需执行以下操作:

$ awk 'NR>1{print $2,$27,$29}' RS='Number of reps:' file
19230 1.186 3.985
13456 3.186 1.345

答案 1 :(得分:2)

试试这个:

awk '/Number of reps:/ { printf "%s ", $NF } /calc *201:/ { print $4,$6 }' myfile.dat

答案 2 :(得分:1)

此脚本将执行您想要的操作:

$ awk '/nrep=/{printf "%s ",$5}$1=="calc"&&$2=="201:"{print $4, $6}' myfile.dat 
19230 1.186 3.985
13456 3.186 1.345

打印包含“nrep =”的行的第五个单词(之后没有换行符),然后打印第一个单词“calc”和第二个“201:”的行的第四个和第六个单词< / p>