【问题标题】:Sorting by last field and printing whole line按最后一个字段排序并打印整行
【发布时间】:2018-08-07 21:03:53
【问题描述】:

我正在尝试使用 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,它不会按姓氏排序。

感谢任何反馈。谢谢:)

【问题讨论】:

    标签: linux sorting awk


    【解决方案1】:
     awk -F " " '{print $NF, $0}' names.txt | sort | sed -r 's/^[^ ]+ //' 
    

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

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

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

    最后,删除最后一个空格。

    【讨论】:

    • 好吧,这很聪明。
    • 我认为 OP 想要保留原始格式。所以,排序后必须删除第一个字段,而不是最后一个字段
    • 这很好,这提供了传统的 Last First Mi,但我可以看到希望是 First Mi Last,但已排序.
    • 抱歉,执行了正确的顺序。 :) 希望我现在明白了,先删除,而不是姓氏。
    【解决方案2】:
    $ 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- 通过删除awksort 打印的最后一个字段$NF 打印回原始行。

    【讨论】:

      【解决方案3】:

      使用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 将是最后一个元素的索引
      • 如果出现平局,则保持原始输入顺序

      【讨论】:

        猜你喜欢
        • 2014-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多