我有一个这样的数据
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
解释:
- 在图案空间中保留两条线。
- 尝试通过查看模式空间中两行的最后一个字段来连接这些行。
- 重复此加入过程,同时最后一个字段相同。
- 然后,当它们不同时,打印第一部分,此时该部分包含所有先前行的第一个字段、空格分隔以及公共最后一个字段。删除这部分,然后返回更多。