按最后一个字段排序并打印整行

时间:2018-02-28 04:12:59

标签: linux sorting awk

我正在尝试使用awk和sort按姓氏对名称文件进行排序。有些人没有中间名。这是一个例子:

Rachel K Green
Chandler M Bing
Ross E Geller
Phoebe Buffay
Monica E Geller
Joey F Tribbiani 

我尝试过的是:

awk -F " " '{print $NF, $0}' names.txt | sort

打印:

Bing Chandler M Bing
Buffay Phoebe Buffay
Geller Monica E Geller
Geller Ross E Geller
Green Rachel K Green
Tribbiani Joey F Tribbiani

我明白为什么要打印姓氏然后打印全行。我无法弄清楚如何按姓氏排序,然后打印该行。如果我只使用$ 0,而不使用$ NF,则不会按姓氏对其进行排序。

感谢任何反馈。谢谢:))

3 个答案:

答案 0 :(得分:1)

 awk -F " " '{print $NF, $0}' names.txt | sort | sed -r 's/^[^ ]+ //' 

最后,在第一个空白之前删除。

对于新订单,我的第一个解决方案保留了排序顺序,但删除了姓氏:

 awk -F " " '{print $NF, $0}' names.txt | sort | sed -r 's/ [^ ]+$//'

最后,在最后一个空白后删除。

答案 1 :(得分:1)

$ awk '{print $NF, $0}' names.txt | sort -k1 | cut -d ' ' -f2-
Chandler M Bing
Phoebe Buffay
Monica E Geller
Ross E Geller
Rachel K Green
Joey F Tribbiani

cut -d ' '-f2-打印回原始行,删除为$NF打印的awk的最后一个字段sort

答案 2 :(得分:0)

使用gawkarray sorting

$ gawk 'BEGIN{PROCINFO["sorted_in"] = "@ind_str_asc"}
       {a[$NF,$0]=$0} END{for(i in a) print a[i]}' names.txt
Chandler M Bing
Phoebe Buffay
Monica E Geller
Ross E Geller
Rachel K Green
Joey F Tribbiani 
  • a[$NF,$0]=$0使用姓氏和整行作为键(单独使用姓氏是不够的,因为有重复项)
  • END{for(i in a) print a[i]}在末尾打印数组内容


如果ruby没问题且需要与输入相同的格式

$ ruby -e 'print *readlines.sort_by {|s| s.split[-1]}' names.txt
Chandler M Bing
Phoebe Buffay
Ross E Geller
Monica E Geller
Rachel K Green
Joey F Tribbiani 
  • readlines将获取数组中的所有输入行
  • sort_by提供自定义排序键
  • 定义自定义排序的
  • {|s| s.split[-1]}块,s.split将在空格上拆分,-1将是最后一个元素的索引
  • 如果是平局,则维持原始输入订单