[英]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.