ある列の値を検索し、ファイルの別の列から関連付けられた値を検索します。

ある列の値を検索し、ファイルの別の列から関連付けられた値を検索します。

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

入力ファイルに追加し、質問に出力を投稿します。 (「コードフェンス」を使用してください```。)その後、ここに別のコメントを残して完了したことを教えてください。

関連情報