根据相同的最后一列分组为行

根据相同的最后一列分组为行

我有一个这样的数据

15 23
16 23
17 24
18 24

我想根据最后一列中的数据对第一列中的数据进行组合/分组:

15 16 23
17 18 24

如何做到这一点awk

答案1

awk

awk '{ seen[$2]= seen[$2]? seen[$2]FS$1:$1 } 
    END{ for (x in seen) print seen[x], x }' infile
15 16 23
17 18 24

在这里,我们使用seen带有列的键$2和列的值的数组$1。如果每个值的键$2都相同,则将该值附加到数组中其前一个值的末尾,并END先打印最终值,然后再打印其键。

三元条件用于检查该键之前数组中是否有值,如果有,则将新值附加到默认值的末尾F产量S之间的运算符FS;否则只需将该值添加为第一个值。

答案2

awk '{AA[$2]=AA[$2]" "$1}END{for(i in AA){print AA[i]" "i}}' datafile.txt

答案3

sed -Ee '
   :join
      $!N
      s/(\s\S+)\n(.*\1)$/ \2/
   tjoin
   P;D
'  input.txt

解释:

  1. 在图案空间中保留两条线。
  2. 尝试通过查看模式空间中两行的最后一个字段来连接这些行。
  3. 重复此加入过程,同时最后一个字段相同。
  4. 然后,当它们不同时,打印第一部分,此时该部分包含所有先前行的第一个字段、空格分隔以及公共最后一个字段。删除这部分,然后返回更多。

相关内容