Печать строк между двумя рисунками с многократным вхождением второго рисунка - PullRequest
0 голосов
/ 23 мая 2018

У меня есть файл, подобный следующему, и я хотел бы напечатать строки между двумя заданными шаблонами PAT1 и PAT2.

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

Здесь PAT1 встречается один раз, но PAT2 встречается несколько раз.Я хотел бы напечатать строки между PAT1 и 3-м вхождением PAT2

. Я использую приведенную ниже команду для печати между шаблонами, которые в этом случае не работают

awk '/PAT1/PAT2/'

Я ожидаюниже вывода

PAT1
3    
4
PAT2
5
6
PAT2
7    
PAT2

Как я могу это сделать?

Ответы [ 4 ]

0 голосов
/ 23 мая 2018

С седом

sed -E '/PAT1/!d;:A;N;/((.*PAT2){3})/!bA' infile
0 голосов
/ 23 мая 2018

Видимо, это работает:

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

См. Комментарии о том, почему это работает.

0 голосов
/ 23 мая 2018

После awk может помочь здесь.В этом решении вы можете указать количество вхождений, до которых вы хотите напечатать строки, поэтому в этом случае я дал значение -v occur=3, вы также можете изменить его на нужное вам.

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

ИЛИ (если вы хотите напечатать вещи до 3-го появления PAT2), исключая строку PAT2, выполните следующую команду.

awk -v occur="3" '/PAT1/{flag=1} /PAT2/{count++} flag && count==occur{flag=""} flag'  Input_file
0 голосов
/ 23 мая 2018

Я думаю, что это то, что вы хотите.

$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 переходить на следующую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...