簡體   English   中英

在兩個圖案之間打印線條,多次出現第二個圖案

[英]Print lines between two patterns with multiple occurrence of 2nd pattern

我有一個像下面這樣的文件,我想打印兩個給定模式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

我怎樣才能做到這一點?

顯然這有用:

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

請參閱有關其工作原理的評論。

我想這就是你想要的。

$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跳轉到下一行。

以下awk可能會有所幫助。 在這個解決方案中,你可以給出你想要打印線的出現次數,所以在這種情況下我給出了值-v occur=3 occurrence -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

用sed

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM