【发布时间】:2013-06-21 10:30:00
【问题描述】:
我必须在输入文件中每次出现表达式“AAA”后打印 81 行。我该怎么做?
【问题讨论】:
-
搜索“awk one liner”。这应该会有所帮助。
标签: regex perl sed awk pattern-matching
我必须在输入文件中每次出现表达式“AAA”后打印 81 行。我该怎么做?
【问题讨论】:
标签: regex perl sed awk pattern-matching
以下成语描述了如何选择给定的记录范围 要匹配的特定模式:
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
【讨论】:
使用 grep 有一种非常简单的方法:
grep -A 81 AAA input_file
来自手册页:
-A NUM, --after-context=NUM
在匹配行之后打印 NUM 行尾随上下文。在连续的匹配组之间放置一个包含组分隔符 (--) 的行。使用 -o 或 --only-matching 选项,这不起作用并给出警告。
【讨论】:
在你的表达式后添加{c=81;next}c-->0:
awk '/AAA/{c=81;next}c-->0' somefile
【讨论】:
打印匹配行和以下81行:
awk '/AAA/{x=NR+81}(NR<=x){print}' input_file
要打印以下 81 行但不是匹配的行:
awk '/AAA/{x=NR+81;next}(NR<=x){print}' input_file
【讨论】:
GNU 代码sed:
sed /AAA/,+81!d file
【讨论】: