![基于一个(键)列分别连接多个字段](https://linux22.com/image/67399/%E5%9F%BA%E4%BA%8E%E4%B8%80%E4%B8%AA%EF%BC%88%E9%94%AE%EF%BC%89%E5%88%97%E5%88%86%E5%88%AB%E8%BF%9E%E6%8E%A5%E5%A4%9A%E4%B8%AA%E5%AD%97%E6%AE%B5.png)
我有一个制表符分隔的测试数据,如下所示:
A 1 2
B 3 4
B 5 6
C 7 8
我想根据第 1 列中的重复值连接(聚合)第 2 列和第 3 列,如下所示:
A 1 2
B 3;5 4;6
C 7 8
现在我根据此处的解决方案开发的工作代码(根据第 1 列合并多行) 不是分别合并多列的值:
<test.txt awk -F"\t" '{OFS="\t"} {a[$1]=($1 in a)?a[$1]";"$2FS$3:$1FS$2FS$3} END{for(i in a){print a[i]}}'
A 1 2
B 3 4;5 6
C 7 8
如果有人可以帮助指出我的代码中的错误,我将非常感激。我尝试了几种变体,但无法正确格式化。
答案1
使用单独的变量来包含每列的串联值。
awk -F'\t' -v OFS='\t' '{
if ($1 in a) {
a[$1] = a[$1]";"$2;
b[$1] = b[$1]";"$3;
} else {
a[$1] = $2;
b[$1] = $3;
}
}
END { for (i in a) print i, a[i], b[i] }' < test.txt
答案2
有点晚了,但这是使用合成子数组的替代方案:
awk -v OFS='\t' '{
if ($1 in arr) {
split(arr[$1], subArr);
arr[$1] = subArr[1] ";" $2 OFS subArr[2] ";" $3;
}
else {
arr[$1] = $2 OFS $3
} }
END {
for (i in arr) print i,arr[i];
}'