パターンマッチング後の複数行の連結

パターンマッチング後の複数行の連結

次のデータを含むファイルがあります。

STUDENT DETAILS
NAME MARKS STD
XYZ 20 I
RANK SCHOOL TEACHER GRADE
5 TTT ANON B
POSITION
5
STUDENT DETAILS
NAME MARKS STD
ABC              40                I
RANK SCHOOL TEACHER GRADE
5 TTT ANON A
POSITION
5

私の出力は次のとおりです。

NAME MARKS STD RANK SCHOOL TEACHER GRADE POSITION
XYZ  20     I   5    TTT   ANON    B     5
ABC  40     I   5    TTT   ANON    A     5

STUDENT DETAILSawkパターンを見つけて2番目、5番目、8番目の行を印刷してみました。しかし、線を接続する必要があります。

私は走る:

awk '/STUDENT DETAILS/{nr[NR];nr[NR+2]; nr[NR+5]; nr[NR+8]}; END {for (i in nr) print nr[i]}' file.txt > filenew.txt

この目標をどのように達成できますか?

ベストアンサー1

awkではあらかじめ読むことができず、パターンを覚えておく必要があります。

awkファイル(下のu.awk)

/STUDENT/ { li=NR;}
NR == li+2 { mark[li]=$0 }
NR == li+4 { pos[li]=$0 }
END { for (m in mark) printf "%s %s\n",mark[m],pos[m] ;}

どこ

  • /STUDENT/ { li=NR;}レコードが始まる行を覚えておいてください
  • NR == li+2 { mark[li]=$0 }現在の動作が+2のときの表示を覚えています(位置も同じ)。

サンプルデータとして実行すると(空白行を削除し、実際のファイルにある場合は+2 / +4を調整します)

awk -f u.awk liste-1.txt

XYZ 20 I 5 TTT ANON B
ABC              40                I 5 TTT ANON A

ヘッダ生成は省略されます。

おすすめ記事