Você pode dividir o arquivo, em seguida, executar grep -q some_method em cada parte e excluí-la, se falso , por exemplo,
for file in part-*.txt; do
grep -q some_method "$file"
if [ $? -ne 0 ]
then
rm "$file"
fi
done
ou
use duas passagens - removendo da entrada as "partes" que contêm some_method e depois dividindo o resultado, por ex. usando sed para a primeira passagem e seu awk para a segunda passagem:
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 copia a 1 ª linha sobre o buffer h old e d elimina, em seguida, acrescenta cada linha que não corresponde a ID ao buffer H old, exclui se não for a última linha e e x altera os buffers nas linhas que correspondem a ID excluindo o espaço padrão se ele não contiver some_method . O resultado é então canalizado para awk . Se você está recebendo too many open files erro, você terá que close() dos arquivos:
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}'
ou, se você estiver em gnu / anything, poderá usar csplit em vez de awk :
sed '1{h;d};/ID/!{H;$!d};x;/some_method/!d' infile | \
csplit -f 'part-' -b '%03d.txt' -sz - /ID/ '{*}'