【问题标题】:print specific number of lines after matching pattern匹配模式后打印特定行数
【发布时间】:2013-06-21 10:30:00
【问题描述】:

我必须在输入文件中每次出现表达式“AAA”后打印 81 行。我该怎么做?

【问题讨论】:

  • 搜索“awk one liner”。这应该会有所帮助。

标签: regex perl sed awk pattern-matching


【解决方案1】:

以下成语描述了如何选择给定的记录范围 要匹配的特定模式:

a) 打印某个模式的所有记录:

awk '/pattern/{f=1}f' file

b) 以某种模式打印所有记录:

awk 'f;/pattern/{f=1}' file

c) 在某种模式之后打印第 N 条记录:

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

d) 在某个模式之后打印除第 N 条记录之外的所有记录:

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

e) 以某种模式打印 N 条记录:

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

f) 以某种模式打印除 N 条记录之外的每条记录:

awk 'c&&c--{next}/pattern/{c=N}1' file

g) 从某个模式打印 N 条记录:

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

我将变量名从“find”的“f”更改为“count”的“c”,其中 合适,因为这更能表达变量的实际含义。

所以,你会想要上面的“e”:

awk 'c&&c--;/AAA/{c=81}' file

【讨论】:

    【解决方案2】:

    使用 grep 有一种非常简单的方法:

    grep -A 81 AAA input_file
    

    来自手册页:

    -A NUM, --after-context=NUM
    在匹配行之后打印 NUM 行尾随上下文。在连续的匹配组之间放置一个包含组分隔符 (--) 的行。使用 -o 或 --only-matching 选项,这不起作用并给出警告。

    【讨论】:

      【解决方案3】:

      在你的表达式后添加{c=81;next}c-->0

      awk '/AAA/{c=81;next}c-->0' somefile
      

      【讨论】:

        【解决方案4】:

        打印匹配行以下81行:

        awk '/AAA/{x=NR+81}(NR<=x){print}' input_file
        

        要打印以下 81 行但不是匹配的行:

        awk '/AAA/{x=NR+81;next}(NR<=x){print}' input_file
        

        【讨论】:

          【解决方案5】:

          GNU 代码

          sed /AAA/,+81!d file
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-07-19
            • 2021-06-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-29
            相关资源
            最近更新 更多