最初の列と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 -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 

関連情報