2つの異なる行から2つのフィールドを抽出する

2つの異なる行から2つのフィールドを抽出する

私のファイルには次の行があります

# Employee Id  : ABC123,
# Employee Name: Vivek
# Employee Type: Temp                     Join Date: 31-jan-2014  Buz Code: 2098
# Employee Comments: 
#              Replacement for Jane
#   Country: India
#   State: Delhi
#
# Employee Id  : GGG67,
# Employee Name: Kumar
# Employee Type: Temp                     Join Date:15-jan-2014  Buz Code: 2176
# Employee Comments: 
#   Country: India
#   State: Delhi
#   Street: Kanot

ここで必要があり、Employee IDすべての従業員を表形式で表しますEmployee NameBuz Code試しましたが、awk期待した結果が得られませんでした。

どんな提案がありますか?

答え1

すでに試したことを示している場合は、宿題のようには見えません。つまり、開始は次のようになります。フィールド名を一致させてフィールドを取得する必要がありますが、次のレコードに達するまで出力しないでください。表示されるすべてのレコードの間に「#」があると便利です。

$ awk -F: -f t.awk t
 ABC123,  Vivek
 GGG67,  Kumar

長い awk スクリプトを別のファイルに保存すると便利です。

$ cat t.awk
/Employee Id/ {empid=$2}
/Employee Name/ {name=$2}
/#/ {print empid, name} # What happens if the next record is missing name?
END {print empid, name}

または1行で:

$ awk -F: '/Employee Id/ {empid=$2}; /Employee Name/ {name=$2}; /#/ {print empid, name}; END {print empid, name}' t

答え2

$ awk '{printf /Employee Id|Employee Name|Buz Code/? $NF" " : " "}' file

$NF一致するパターンが見つかったら、最後のフィールドを印刷します。たとえばEmployee Id...|そうでない場合は、?単一のスペースを印刷します" "

列順序の結果:

ABC123, Vivek 2098      GGG67, Kumar 2176

または

awk '/Employee Id|Employee Name|Buz Code/ {if(++i%4==0) printf RS;printf $NF FS }' file

これはRS改行文字を意味し、\n単一のFSスペース(デフォルト)を意味します。

行順序の結果:

ABC123, Vivek 2098
GGG67, Kumar 2176

関連情報