0

我有一个如下所示的输入文件:

aaa 111    
aaa 222
aaa 333
bbb 444
bbb 555

我想创建一个如下所示的转置输出文件:

aaa 111,222,333
bbb 444,555

我怎样才能使用 , 等来做到这awk一点sed

4

2 回答 2

2

一种使用方式awk

$ awk '{a[$1]=a[$1]?a[$1]","$2:$2}END{for(k in a)print k,a[k]}' file
aaa 111,222,333
bbb 444,555

如果您的实现awk不支持三元运算符,那么:

$ awk 'a[$1]{a[$1]=a[$1]","$2;next}{a[$1]=$2}END{for(k in a)print k,a[k]}' file 
aaa 111,222,333
bbb 444,555

您的新文件不会对脚本造成任何问题,您得到什么输出?我怀疑这可能是一个行尾问题。运行dos2unix file以修复行尾。

$ cat file
APM00065101435 189
APM00065101435 190
APM00065101435 191
APM00065101435 390
190104555 00C7
190104555 00D1
190104555 00E1
190104555 0454
190104555 0462

$ awk '{a[$1]=a[$1]?a[$1]","$2:$2}END{for(k in a)print k,a[k]}' file
APM00065101435 189,190,191,390
190104555 00C7,00D1,00E1,0454,0462
于 2013-06-29T21:22:29.557 回答
0

GNU 的代码:


我为此提出了一个问题,并从potong得到了一个非常好的和有用的答案

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


sed -r ':a;$!N;s/^((\S+\s).*)\n\2/\1,/;ta;P;D' file
于 2013-06-30T16:10:39.393 回答