代码之家  ›  专栏  ›  技术社区  ›  Richard H

Bash:按最后一个字段值对文本文件排序

  •  23
  • Richard H  · 技术社区  · 15 年前

    我有一个包含大约30万行的文本文件。每一行都有不同数量的逗号分隔字段,最后一个字段保证是数字字段。我想按最后一个数字字段对文件进行排序。我做不到:

    sort -t, -n -k 2 file.in > file.out
    

    因为每行中的字段数不是常量。我想塞德,也许是答案,但不知道怎么做。例如:

    awk -F, '{print $NF}' file.in
    

    给我最后一列的值,但是如何使用它来排序文件?

    6 回复  |  直到 15 年前
        1
  •  33
  •   Fred Foo    13 年前

    使用awk将数字键放在前面。 $NF

    awk -F, '{ print $NF, $0 }' yourfile | sort -n -k1 | sed 's/^[0-9][0-9]* //'
    
        2
  •  3
  •   Benoit    15 年前
    vim file.in -c '%sort n /.*,\zs/' -c 'saveas file.out' -c 'q'
    
        3
  •  0
  •   zwol    15 年前

    在排序之前,也许可以反转文件中每一行的字段?有点像

    perl -ne 'chomp; print(join(",",reverse(split(","))),"\n")' |
      sort -t, -n -k1 |
      perl -ne 'chomp; print(join(",",reverse(split(","))),"\n")'
    

    应该这样做,只要逗号不以任何方式引用。如果这是一个完整的CSV文件(其中逗号可以用反斜杠或空格引起来),那么您需要一个真正的CSV解析器。

        4
  •  0
  •   Benoit    15 年前

    @lines=<STDIN>;foreach(sort{($a=~/.*,(\d+)/)[0]<=>($b=~/.*,(\d+)/)[0]}@lines){print;}
    
        5
  •  0
  •   mmrtnt    11 年前

    我打算把我的作为一个替代方案(我无法让awk工作):)

    示例文件:

    Call of Doody                           1322
    Seam the Ripper                         1329
    Mafia Bots 1                            1109
    Chicken Fingers                         1243
    Batup Light                             1221
    Hunter F Tomcat                         1140
    Tober                                   0833
    

    代码:

    for i in `sed -e 's/.* \(\d\)*/\1/' file.txt | sort`; do grep $i file.txt; done > file_sort.txt
    
        6
  •  0
  •   Sebastian Wagner    8 年前

    python -c "print ''.join(sorted(open('filename'), key=lambda l: int(l.split(',')[-1])))"