$ awk '
/THEAD/{f=1; c=0; a = $0; next}
f{a = a ORS $0; if(/TCUST/) c++}
/TTAIL/{f=0; if(c > 1){print a; m=1} }
ENDFILE{if(m) print FILENAME; m=0}
' ip.txt
THEAD
TCUST
TCUST
TITEM
TITEM
TTEND
TTAIL
THEAD
TCUST
TCUST
TITEM
TTEND
TTAIL
ip.txt
-
/THEAD/{f=1; c=0; a = $0; next}
padrão inicial, defina o sinalizador e inicialize o contador. Salvar linha atual para impressão posterior -
f{a = a ORS $0; if(/TCUST/) c++}
quando o sinalizador estiver definido, acumular linhas de entrada na variávela
e incrementar o contador se a linha corresponder aTCUST
-
/TTAIL/{f=0; if(c > 1){print a; m=1} }
padrão finalizador, sinalizador claro. Imprimir o conteúdo dea
se o contador for maior que1
, também definir a variávelm
que pelo menos uma correspondência foi encontrada -
ENDFILE{if(m) print FILENAME; m=0}
depois que todas as linhas forem processadas para um arquivo, imprima o nome do arquivo de entrada sem
estiver definido e limpo antes do próximo arquivo ser processado (Obrigado @Costas por apontar vários requisitos de arquivo)
Observação: ENDFILE
is GNU awk
specific, não sei como lidar com isso sem ENDFILE
Obrigado @Costas pela solução não dependente do ENDFILE
específico do GNU:
$ awk '
FNR==1{if(m) print fname; m=0; fname=FILENAME}
/THEAD/{f=1; c=0; a = $0; next}
f{a = a ORS $0; if(/TCUST/) c++}
/TTAIL/{f=0; if(c > 1){print a; m=1} }
END{if(m) print fname}
' *.txt