Попробуйте:
awk 'FNR==NR{re=re (re?"|":"")$0;next} /^"GRP_START"/{if (rec~re)print rec; rec=$0;next} {rec=rec"\n"$0} END{if (rec~re)print rec}' keywords.txt basefile.txt
Пример:
$ awk 'FNR==NR{re=re (re?"|":"")$0;next} /^"GRP_START"/{if (rec~re)print rec; rec=$0;next} {rec=rec"\n"$0} END{if (rec~re)print rec}' keywords.txt basefile.txt
"GRP_START","LINE1"........
"A"
"B--BOOM"
"C"
"GRP_START","LINE1"........
"A"
"B--DOOM"
"C"
"D"
"E"
"F"
"G"
"GRP_START","LINE1"........
"E"
"F"
"G"
"C--MOOM"
FNR==NR{re=re (re?"|":"")$0;next}
Читая первый файл, keywords.txt
, мы строим регулярное выражение для соответствия любому из слов. Например, для данных образца создается переменная re
со значением BOOM|DOOM|MOOM
.
/^"GRP_START"/{if (rec~re)print rec; rec=$0;next}
Каждый раз, когда мы достигаем начала новой записи, мы проверяем, соответствует ли последняя запись, хранящаяся в rec
, регулярным выражениям, хранящимся в re
. Если да, то мы выводим ее. Далее rec
сбрасывается на текущую строку, и мы пропускаем остальные команды и переходим к строке next
.
rec=rec"\n"$0
Для всех остальных строк мы добавляем их к rec
.
END{if (rec~re)print rec}
После завершения чтения файла мы проверяем, соответствует ли последняя запись регексу re
, и если да, то печатаем ее.