次のファイルがあります
FHEAD
THEAD
TCUST
TITEM
TTEND
TTAIL
THEAD
TCUST
TCUST
TITEM
TITEM
TTEND
TTAIL
THEAD
TCUST
TITEM
TTEND
TTAIL
THEAD
TCUST
TCUST
TITEM
TTEND
TTAIL
THEADとTTAILの間に複数回表示されるONLY TCUSTレコードの発生回数を計算し、対応するファイル名と行を印刷する必要があります。
複数のファイルがあるため、ファイル名も印刷する必要があります。
予想される結果は
THEAD TCUST TCUST TITEM TITEM TITEM TTEND TTAIL THEAD TCUST TCUST TITEM TTEND TTAIL ファイル名
ベストアンサー1
$ 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}
モードを開始し、フラグを設定し、カウンタを初期化します。後で印刷するために現在の行を保存します。f{a = a ORS $0; if(/TCUST/) c++}
フラグを設定した後、入力ラインをa
変数に蓄積し、ラインが一致するとカウンタをインクリメントします。TCUST
/TTAIL/{f=0; if(c > 1){print a; m=1} }
終了モード、明確な表示。a
counterが次より大きい場合、内容を印刷し、1
少なくともm
1つの一致が見つかった変数を設定します。ENDFILE{if(m) print FILENAME; m=0}
ファイルのすべての行が処理されたら、入力ファイル名(m
設定されている場合)を印刷し、次のファイルを処理する前に消去します(複数のファイル要件を指摘した@Costasに感謝します)
メモ: ENDFILE
具体的GNU awk
でどのように処理するのかわかりません。ENDFILE
GNU以外の特定のソリューションについて@Costasに感謝しますENDFILE
。
$ 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