如何使用awk合并右侧数据时左侧是常见的

时间:2013-03-04 06:30:37

标签: unix sed awk

我想使用awk合并左侧数据时文件的右侧。

输入文件:

cazd0002221|1
cazd0002221|2
ceed0008792|2
croty000287|3
cazd0002221|3
crory000287|3
ceed0008792|1
ceed0008792|2

预期输出为:

cazd0002221|1,2,3
ceed0008792|2,1
croty000287|3
crory000287|3

2 个答案:

答案 0 :(得分:1)

awk -F"|" '{a[$1]=a[$1]","$2;next}END{for(i in a)print i"|"substr(a[i],2)}' your_file

测试如下:

> cat temp
cazd0002221|1
cazd0002221|2
ceed0008792|2
croty000287|3
cazd0002221|3
crory000287|3
ceed0008792|1
ceed0008792|2
> awk -F"|" '{a[$1]=a[$1]","$2;next}END{for(i in a)print i"|"substr(a[i],2)}' temp
cazd0002221|1,2,3
ceed0008792|2,1,2
crory000287|3
croty000287|3

您的输入ceed0008792|2中有重复的行。这就是为什么输出具有此行ceed0008792|2,1,2的原因 如果你想消除那个重复的行,那么按以下步骤操作:

> sort -u temp | awk -F"|" '{a[$1]=a[$1]","$2;next}END{for(i in a)print i"|"substr(a[i],2)}'
cazd0002221|1,2,3
ceed0008792|1,2
crory000287|3
croty000287|3

答案 1 :(得分:0)

这可能适合你(sort& GNU sed);

sort file | sed ':a;$!N;s/^\(\([^|]*|\).*\)\n\2/\1,/;ta;P;D'