$ 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ávelae 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 dease o contador for maior que1, também definir a variávelmque 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 semestiver 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