搜索一列的值并从文件的其他列检索串联值

搜索一列的值并从文件的其他列检索串联值

我有一个包含 4 列的文本文件,数据如下所示:

P_ID         C_ID         Code         MSG
10            12          001         abcd
20            21          003         jklm
10            12          002         hijk

这里 P_ID、C_ID、Code 和 MSG 是列。

需要针对 C_ID 列进行搜索,如果同一 C_ID 值有多个条目但具有不同的 code 和 msg 列值,则最终文件应具有如下面的预期输出文件所示的结果,其中 code 和 msg 列值是用逗号连接成一行。

预期输出应该类似于:

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

在您的输入文件上并将输出发布在您的问题中。 (请使用```“代码围栏”。)然后在这里发表另一条评论,让我知道您已经做到了。

相关内容