首页 文章

在两个图案之间打印线条,多次出现第二个图案

提问于
浏览
1

我有一个像下面这样的文件,我想打印两个给定模式PAT1和PAT2之间的行 .

1
2
PAT1
3    
4
PAT2
5
6
PAT2
7    
PAT2
8
9
PAT2
10

这里PAT1出现一次,但PAT2出现多次 . 我想在PAT1和PAT2的第3次出现之间打印线

我使用下面的命令来打印在这种情况下不起作用的模式

awk '/PAT1/PAT2/'

我期待以下输出

PAT1
3    
4
PAT2
5
6
PAT2
7    
PAT2

我怎样才能做到这一点?

4 回答

  • 3

    显然这有用:

    $ awk '/PAT1/,/PAT2/&&++c==3' file
    PAT1
    3 
    4
    PAT2
    5
    6
    PAT2
    7 
    PAT2
    

    请参阅有关其工作原理的评论 .

  • 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 *,您可以通过删除“下一个”语句来包含它们,这使得awk跳转到下一行 .

  • 0

    以下 awk 可能会有所帮助 . 在这个解决方案中,您可以给出要打印行的出现次数,所以在这种情况下我给出了值 -v occur=3 您可以根据需要将其更改为 .

    awk -v occur="3" '/PAT1/{flag=1} flag; /PAT2/{count++} flag && count==occur{flag=""}'  Input_file
    

    或者(如果你想在第三次出现PAT2之前打印东西)除了PAT2字符串,然后运行以下 .

    awk -v occur="3" '/PAT1/{flag=1} /PAT2/{count++} flag && count==occur{flag=""} flag'  Input_file
    
  • 0

    用sed

    sed -E '/PAT1/!d;:A;N;/((.*PAT2){3})/!bA' infile
    

相关问题