次のリストがあります。
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 -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