如何使用awk在某些模式之后打印第N个记录的部分

时间:2016-02-24 14:33:39

标签: regex awk gawk

我是一个新的awk用户,所以我现在还有很多事情要做。我需要打印一些遵循特定模式的线条。例如,我将此数据作为文件的一部分 星号中的q数= 1

 List of q in the star:
      1   0.000000000   0.000000000   0.000000000

      Dielectric constant in cartesian axis

      (      12.793033167       0.000000000       0.000000000 )
      (       0.000000000      12.793033167       0.000000000 )
      (       0.000000000       0.000000000      12.793033167 )

我只需要提取数字12.793033167,我的模式是“明星中的q列表”。

我找到了如何在模式之后提取整行的解决方案:

awk 'c&&!--c;/pattern/{c=N}' file

但是我不明白如何以仅打印第二列的方式更新它(与打印$ 2一样)。

有人能提供一个好的解决方案吗?另外,如果能够详细解释它的整体运作方式,那将会很高兴。

1 个答案:

答案 0 :(得分:2)

你几乎就在那里

$ awk 'c&&!--c{print $2} /List of q/{c=5}' file

12.793033167

$2是第二个字段。

c&&!--c是智能计数器,在模式匹配后将值c = 5替换为开始倒计时(c的初始值为零)。

5 && !4 -> false
4 && !3 -> false
3 && !2 -> false
2 && !1 -> false
1 && !0 -> true

当条件为真时触发动作,c的退出值为0.

您还需要知道,false && b b未被评估(短路规则)。 --c预先递减值。埃德莫顿有一篇文章,其中有更多smart counters

的例子