Вы можете разделить файл, затем запустить grep -q some_method
для каждого фрагмента и удалить его, если false например,
for file in part-*.txt; do
grep -q some_method "$file"
if [ $? -ne 0 ]
then
rm "$file"
fi
done
или
используйте два прохода - удаление из ввода "частей", содержащих some_method
, а затем разделение результата, напримериспользуя sed
для первого прохода и ваш код awk
для второго прохода:
sed -e '1{h;d;}' -e '/ID/!{H;$!d;}' -e 'x;/some_method/!d' infile | \
awk '/ID/{++part}{print > sprintf("part-%03d.txt", part)}'
sed
копирует 1-ю строку поверх старого буфера h
и d
удаляет его, затем добавляет каждую строку, которая не соответствует ID
, в старый буфер H
, удаляет ее, если это не последняя строка, и e x
изменяет буферы в строках, которые соответствуют ID
, удаляя пространство шаблонов, если оно не содержит some_method
. Затем результат передается на awk
. Если вы получаете ошибку слишком много открытых файлов
, вам придется close ()
файлы:
sed -e '1{h;d;}' -e '/ID/!{H;$!d;}' -e 'x;/some_method/!d' infile | \
awk '/ID/{++part}{close(fn);fn=sprintf("part-%03d.txt", part);print >> fn}'
или, если вы используете gnu
/ что угодно, вы можете использовать csplit
вместо awk
:
sed '1{h;d};/ID/!{H;$!d};x;/some_method/!d' infile | \
csplit -f 'part-' -b '%03d.txt' -sz - /ID/ '{*}'