Sort

在幾列上排序 -u (或 sort | uniq),但將資訊保留在第三列中,並將其附加到保留的行?

  • August 26, 2020

我正在嘗試使用這樣的表格:

a     b     hello
a     b     goodbye
g     g     test
a     c     I say

將表格折疊到第 1 列和第 2 列上的每個唯一條目一行,但不會失去第 3 列中的任何資訊。第 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

我失去了“再見”的條目,但我想保留它。有誰知道如何避免丟棄第 3 列中的數據,如上例所示?

我不知道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

或者更冗長(但更靈活)的米勒

mlr --nidx --fs tab nest --implode --values --across-records --nested-fs , -f 3  file

引用自:https://unix.stackexchange.com/questions/606347