次の形式を取りたいと思います。
a b hello
a b goodbye
g g test
a c I say
列 3 の情報を失うことなく、列 1 と 2 の各固有項目について、表を 1 行に縮小します。列3の値は、カンマ区切りリストとして追加できます。結果は次のとおりです。
a b hello, goodbye
a c I say
g g test
どこから始めるべきかわかりません。を使用すると、sort -k1,1 -k2,2 -u
次のような結果が得られます。
a b hello
a c I say
g g test
「Goodbye」のアイテムを紛失しましたが、保管したいと思います。上記の例に示すように、3列のデータを削除しない方法を知っている人はいますか?
ベストアンサー1
スタンドアロンの方法はわかりませんが、sort
awkを使用して値を「縮小」してから並べ替えることができます。
$ awk -F'\t' '
BEGIN{OFS=FS}
{k = $1 FS $2}
{a[k] = a[k] == "" ? $3 : a[k] "," $3}
END{for (k in a) print k,a[k]}
' file | sort
a b hello,goodbye
a c I say
g g test
最新バージョンのGNU awkでは、次のように設定して、外部の並べ替えを避けるために配列の巡回順序を設定できますPROCINFO
。
awk -F'\t' '
BEGIN{OFS=FS}
{k = $1 FS $2}
{a[k] = a[k] == "" ? $3 : a[k] "," $3}
END{PROCINFO["sorted_in"]="@ind_str_asc"; for (k in a) print k,a[k]}
' file
または GNU datamash を使用してください。
datamash groupby 1,2 collapse 3 <file
またはより詳細な(しかしより柔軟な)Miller
mlr --nidx --fs tab nest --implode --values --across-records --nested-fs , -f 3 file