我有一个要求。假设我的文件内容是
a
b
c
d
e
f
d
e
f
我想b
重复打印从 到 第二次的行d
。有没有使用 awk 的命令来做到这一点?
输出应该是
b
c
d
e
f
d
如果是第一次b
,我知道命令
awk '/b/,/d/' file.txt
但如果第二次重复,我想将文本打印到匹配点。我想将命令写在一行中。
答案1
一种方法是使用标志和计数器来跟踪
$ awk '/b/{f=1; c=0} f; /d/ && ++c==2{f=0}' file.txt
b
c
d
e
f
d
/b/{f=1; c=0}
设置开始比赛标志并初始化计数器f;
设置长标志时打印输入记录/d/ && ++c==2{f=0}
如果结束字符串第二次匹配则清除标志- 可以简化为
awk '/b/{f=1} f; /d/ && ++c==2{exit}'
如果只有一组要提取
请注意,如果结束匹配没有 2 个匹配,它将打印直到输入结束
$ seq 10 | awk '/4/{f=1; c=0} f; /6/ && ++c==2{f=0}'
4
5
6
7
8
9
10
答案2
- 更具可读性的代码。跟踪字符数。
- 只要 b=1 且 d<=2 的计数就打印。
一旦 d 的计数达到 2,就停止。
awk '{ a[$1]++; if(a["b"]==1 && a["d"]<=2){ print; } if(a["d"]==2){ a["d"]=10 } }' file.txt