我有一个如下文件,我想打印两个给定模式PAT1和PAT2之间的线。
()
这里PAT1出现一次,但PAT2出现多次。我想在PAT1和PAT2的第3次出现之间打印行
我使用以下命令在模式之间打印,在这种情况下不起作用
1
2
PAT1
3
4
PAT2
5
6
PAT2
7
PAT2
8
9
PAT2
10
我期待以下输出
awk '/PAT1/PAT2/'
我该怎么做?
答案 0 :(得分:3)
显然这有效:
$ awk '/PAT1/,/PAT2/&&++c==3' file
PAT1
3
4
PAT2
5
6
PAT2
7
PAT2
请参阅有关其工作原理的评论。
答案 1 :(得分:0)
我认为这就是你想要的。
$cat file | awk 'BEGIN{foundPAT1=0; foundPAT2=0;} {if($0=="PAT1"){foundPAT1=1;next} if($0=="PAT2"){foundPAT2+=1;next} if(foundPAT2==3)exit; if(foundPAT1) print;}'
这将等到它找到PAT1,然后打印直到找到PAT2 3次并退出该文件。 这将从输出中排除PAT *,您可以通过删除" next"来包含它们。声明,使awk跳到下一行。
答案 2 :(得分:0)
关注awk
可能会有所帮助。在此解决方案中,您可以给出要打印行的出现次数,因此在这种情况下,我已经给出了值-v occur=3
,您可以根据需要将其更改为。
awk -v occur="3" '/PAT1/{flag=1} flag; /PAT2/{count++} flag && count==occur{flag=""}' Input_file
OR(如果你想在第3次出现PAT2之前打印东西)除了PAT2字符串,然后运行以下。
awk -v occur="3" '/PAT1/{flag=1} /PAT2/{count++} flag && count==occur{flag=""} flag' Input_file
答案 3 :(得分:0)
使用sed
sed -E '/PAT1/!d;:A;N;/((.*PAT2){3})/!bA' infile