複数の列をソートする -u(またはソート| uniq)が、3番目の列に情報を保持し、保持された行に追加しますか?

複数の列をソートする -u(またはソート| uniq)が、3番目の列に情報を保持し、保持された行に追加しますか?

次の形式を取りたいと思います。

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

スタンドアロンの方法はわかりませんが、sortawkを使用して値を「縮小」してから並べ替えることができます。

$ 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

おすすめ記事