4つの列を持つテキストファイルがあり、データは次のとおりです。
P_ID C_ID Code MSG
10 12 001 abcd
20 21 003 jklm
10 12 002 hijk
ここで、P_ID、C_ID、コード、およびMSGは列です。
C_ID列に対して検索を実行する必要があります。同じ C_ID 値に対して複数の項目があるが、コードと msg 列の値が異なる場合、最終ファイルには次の出力ファイルに示すように結果が必要です。ここで、コードと msg 列の値はコンマで区切られ、1 行に連結されます。
予想される出力は次のようになります。
P_ID C_ID Code MSG
10 12 001,002 abcd,hijk
20 21 003 jklm
出力は次のとおりです。
1: NF=4
$1=[P_ID]
$2=[C_ID]
$3=[Code]
$4=[MSG]
2: NF=4
$1=[10]
$2=[12]
$3=[001]
$4=[abcd]
3: NF=4
$1=[20]
$2=[21]
$3=[003]
$4=[jklm]
4: NF=4
$1=[10]
$2=[12]
$3=[002]
$4=[hijk]
最初の回答で提供されたソリューションの結果は次のとおりです。
P_ID C_ID Code MSG
10 12 001 abcd
20 21 003 jklm
10 12 002 hijk
列名とそのデータを検証するawkコマンドはうまく機能しますが、答えとして提供された最初のコマンドは期待した結果を提供しません。
答え1
問題が明確になると改善が必要になるかもしれませんが、現状に基づいて
awk '
BEGIN { unique_vals = 0 }
NR == 1 { print }
NR > 1 {
if (seen[$2] == "") {
i = seen[$2] = unique_vals++
P_ID[i] = $1
C_ID[i] = $2
Code[i] = $3
MSG[i] = $4
} else {
i = seen[$2]
Code[i] = Code[i] "," $3
MSG[i] = MSG[i] "," $4
}
}
END {
for (i=0; i<unique_vals; i++) {
printf "%-15s%-11s%-15s%s\n", P_ID[i], C_ID[i], Code[i], MSG[i]
}
}
' file
仕事をしているようです。
さて、私はあなたが走る方法を知っていると仮定しますawk
。そうでない場合は、そう言ってください。これを行うには、次のデバッグスクリプトを実行します。
awk '
{
print NR ": NF=" NF
print " $1=[" $1 "]"
print " $2=[" $2 "]"
print " $3=[" $3 "]"
print " $4=[" $4 "]"
}
' file
入力ファイルに追加し、質問に出力を投稿します。 (「コードフェンス」を使用してください```
。)その後、ここに別のコメントを残して完了したことを教えてください。