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/ '{*}'