仅对第一列和 uniq 进行排序

仅对第一列和 uniq 进行排序

我有一个如下列表:

1,cat  
1,dog  
2,apple  
3,human

我想要这样的输出:

1,cat,dog  
2,apple  
3,human  

因此,第 1 列中的值 1 包含第 2 列中的 cat 和dog 的值。这可能吗?

答案1

假设第一列严格排序:

$ awk -F, '$1==last {printf ",%s",$2;next} NR>1{print""} {last=$1;printf "%s",$0} END{print""}' file
1,cat,dog
2,apple
3,human

或者,允许输入行按任何顺序(并且输出行不保证顺序):

$ awk -F, '{a[$1]=a[$1]","$2} END{for (i in a)print i a[i]}' file
1,cat,dog
2,apple
3,human

答案2

在 Perl 中:

$ perl -F',' -lane 'push @{$k{$F[0]}},@F[1..$#F]; 
                    END{$,=",";print $_,@{$k{$_}} for keys(%k)}' file 
2,apple
1,cat,dog
3,human

或者,对于排序输出:

$ perl -F',' -lane 'push @{$k{$F[0]}},@F[1..$#F]; 
                    END{$,=",";print $_,@{$k{$_}} for sort keys(%k)}' file 
1,cat,dog
2,apple
3,human

这样做的优点是能够处理任意数量的字段。如果您的所有行都只有 2 个字段,您可以简化为

perl -F',' -lane 'push @{$k{$F[0]}},$F[1]; 
                  END{$,=",";print $_,@{$k{$_}} for sort keys(%k)}' file 

相关内容