使用awk仅打印第n个匹配项

时间:2014-02-04 14:32:48

标签: regex bash awk

这个被多次询问,但我仍然无法解决。 我文件的一部分如下:

 GKKRBSF:: ewrat=   0.00000 (<1 searchk, >1 searche)
           dirat=   0.00000 (Direct Summation ratio)
nhat,betah=  0.1000D+01 0.0000D+00 0.1000D+01      0.10000D+00
nhat,betah=  0.1000D+01 0.0000D+00 0.1000D+01      0.10000D+00
nhat,betah=  0.1000D+01 0.0000D+00 0.1000D+01      0.10000D+01
nhat,betah=  0.1000D+01 0.0000D+00 0.1000D+01      0.10000D+01
nhat,betah=  0.1000D+01 0.0000D+00 0.1000D+01      0.10000D+00

这是介于文件之间的某个地方。我必须得到nhat,betah的第一个和第n个(在这个特定示例中为第3个)匹配的$ 5。 对于第一行,我可以很容易地做到:

var_M=`awk '/nhat,betah=/{print  $5;exit}' filename`

但是,如何获得第3行并退出? 我试着从this主题开始:

var_M=`awk '/nhat,betah=/{j++}j=3{print  $5;exit}' filename`

这是给出文件第3行的第5列,而不匹配模式。 当然我错过了一些东西。 有什么帮助吗?

1 个答案:

答案 0 :(得分:4)

您可以跟踪它出现的次数:

$ awk '/nhat,betah=/{i++; if (i==3) {print $5; exit}}' file
0.30000D+01

解释

你几乎拥有它,只是以适当的方式将条件置于其中:

var_M=$(awk '/nhat,betah=/{j++} j=3{print  $5;exit}' filename)
                                 ^

var_M=$(awk '/nhat,betah=/{j++} j==3{print  $5;exit}' filename)
                                 ^^

注意我将最后一列更改为0.NumberOfLine,以便更清楚地输出哪一行:

 GKKRBSF:: ewrat=   0.00000 (<1 searchk, >1 searche)
           dirat=   0.00000 (Direct Summation ratio)
nhat,betah=  0.1000D+01 0.0000D+00 0.1000D+01      0.10000D+00
nhat,betah=  0.1000D+01 0.0000D+00 0.1000D+01      0.20000D+00
nhat,betah=  0.1000D+01 0.0000D+00 0.1000D+01      0.30000D+01
nhat,betah=  0.1000D+01 0.0000D+00 0.1000D+01      0.40000D+01
nhat,betah=  0.1000D+01 0.0000D+00 0.1000D+01      0.50000D+00