2つの列で構成されるファイルがあります。
A,val1
A,val2
A,val3
B,val1
B,val2
B,val3
私にとって必要なのは、最初の列のすべての固有値に対して、2番目の列が水平になるように出力を変換できることです。
A,val1,val2,val3
B,val1,val2,val3
BASHやAWKを使用するのが最善の方法かどうかはわかりません。両方を組み合わせたものかもしれません。誰でも正しい方向を教えてください。
ベストアンサー1
awkのみを使用:
$ awk -F, 'BEGIN{OFS=FS} {a[$1] = a[$1] == "" ? $2 : a[$1] FS $2} END {for(i in a) print i,a[i]}' file
A,val1,val2,val3
B,val1,val2,val3
出力順序は保証されません。 GNU awkで修正するのは簡単ですが、他の実装ではより難しいです。入力データをソートする必要はありません。
それ以外の場合は、GNU datamashを使用してください。
datamash -t, groupby 1 collapse 2 < file
(入力が揃っていない場合は追加-s
)またはMillerを使用して
mlr --nidx --fs ',' nest --implode --values --across-records --nested-fs ',' -f 2 file
または、よりコンパクトで更新されたバージョン
mlr --nidx --fs ',' nest --ivar ',' -f 2 file