2つの固定語間の単語数の計算

2つの固定語間の単語数の計算

次のファイルがあります

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} }終了モード、明確な表示。acounterが次より大きい場合、内容を印刷し、1少なくともm1つの一致が見つかった変数を設定します。
  • 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

おすすめ記事