8

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

4

5 回答 5

20

以下成语描述了如何在给定特定模式的情况下选择一系列记录进行匹配:

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

我将变量名称从“found”的“f”更改为“count”的“c”,因为这更能表达变量的实际含义。

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

awk 'c&&c--;/AAA/{c=81}' file
于 2013-06-24T20:42:38.803 回答
7

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

grep -A 81 AAA input_file

从手册页:

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

于 2013-06-24T19:36:37.877 回答
6

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

awk '/AAA/{c=81;next}c-->0' somefile
于 2013-06-24T19:36:48.847 回答
5

打印匹配行以下 81 行:

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

打印以下 81 行但打印匹配行:

awk '/AAA/{x=NR+81;next}(NR<=x){print}' input_file
于 2013-06-24T19:41:16.523 回答
4

GNU 的代码:

sed /AAA/,+81!d file
于 2013-06-24T22:22:00.913 回答