【问题标题】:How top print part of the Nth record after some pattern using awk如何使用 awk 在某些模式后打印第 N 条记录的一部分
【发布时间】:2016-02-24 14:33:39
【问题描述】:

我是一个新的 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

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

谁能提供一个好的解决方案?此外,如果能详细解释一下它的整体工作原理,那就太好了。

【问题讨论】:

    标签: regex awk gawk


    【解决方案1】:

    你快到了

    $ 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 预先递减值。 Ed Morton 有一个帖子,其中包含更多 smart counters 的示例

    【讨论】:

    • 您能解释一下这种 awk 代码是如何工作的吗? (或者最好给出一个解释链接——我敢肯定我不是第一个问的人)。
    • 另外,我将来可能会遇到一些不同(并且更普遍)的问题 - 如何从模式之后的第 N 个开始提取 M 行(或行中的某些字段)(其中包括M=0 的情况 - 包括模式线)。我认为它应该是类似的,但我现在仍然不知道到底有多相似。
    • 查看参考的帖子。
    • 好的,非常感谢。你提议的那个效果很好,我稍后会处理其他的。
    • 我也遇到了这个解决方案stackoverflow.com/a/18569128/5975065(用于多行打印),我根本不明白......它看起来使用了一些正则表达式和 awk 的功能,没有智能之类的东西计数器
    猜你喜欢
    • 2010-12-18
    • 1970-01-01
    • 2021-03-10
    • 2021-09-21
    • 2023-02-04
    • 2018-12-31
    • 2013-12-06
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多