我有一个如下列表:
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