使用 awk 打印从一个匹配到另一个单独匹配的第二个实例的行

使用 awk 打印从一个匹配到另一个单独匹配的第二个实例的行

我有一个要求。假设我的文件内容是

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

  1. 更具可读性的代码。跟踪字符数。
  2. 只要 b=1 且 d<=2 的计数就打印。
  3. 一旦 d 的计数达到 2,就停止。

    awk '{ a[$1]++;
        if(a["b"]==1 && a["d"]<=2){
            print;
        }
        if(a["d"]==2){
           a["d"]=10
        }
    }' file.txt
    

相关内容