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