shell 按最后一个“元素”对行排序[非csv文本文件]

j91ykkif  于 2022-12-19  发布在  Shell
关注(0)|答案(2)|浏览(121)

对于由点分隔符分隔的具有相同列数的行,如

aa.bb
cc.dd
...

按最后一列排序很容易

sort -t. -k2,2 file

如果文本文件具有不同的“列”,例如

aa.b.xb
cc.dd
xx.cc.aa
a.b.c.d.e
...

然后如何按最后一个“列”对行进行排序

xx.cc.aa
cc.dd
a.b.c.d.e
aa.b.xb
...
icomxhvb

icomxhvb1#

您可以在bash中使用Schwartzian transform

awk -F. '{print $NF "\t" $0}' file | sort -k1,1 | cut -f2-
  • 首先提取最后一列,并将其添加到由制表符分隔的行的前面。
  • 然后用第1列(前置)对行进行排序。
  • 最后,使用cut命令删除第1列。
piok6c0g

piok6c0g2#

使用GNU awk。将数组(a)的索引按字符串升序排序:

awk 'BEGIN{ FS="."; PROCINFO["sorted_in"]="@ind_str_asc" }
     { a[$NF]=$0 }
     END{ for(i in a) { print a[i]} }' file

输出:

cc.dd
a.b.c.d.e
aa.b.xb

参见:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

相关问题