我正在尝试使用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,则不会按姓氏对其进行排序。
感谢任何反馈。谢谢:))
答案 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)
使用gawk
和array 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
将是最后一个元素的索引