【问题标题】:Bash: sort text file by last field valueBash:按最后一个字段值对文本文件进行排序
【发布时间】:2011-04-19 10:12:35
【问题描述】:

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

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

因为每行中的字段数不是恒定的。我认为 sed, awk 也许是答案,但不确定如何。例如:

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

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

【问题讨论】:

    标签: sorting sed awk


    【解决方案1】:

    也许在排序之前反转文件中每一行的字段?类似的东西

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

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

    【讨论】:

      【解决方案2】:
      vim file.in -c '%sort n /.*,\zs/' -c 'saveas file.out' -c 'q'
      

      【讨论】:

      • 如果你要走那条路,为什么不使用ex?无论如何,Vim 从ex 获得了特定的功能。
      • ex 只是vim,带有-e 选项。在这种情况下并不重要。
      • ex 早于vim(和vi)很长一段时间。 vim 可能有 ex 仿真模式,但这并不能使它成为 ex
      • 是的。但是,如果您的系统上有 vim,ex 通常将是指向vim 的符号链接。 Vim 在启动时检测它被调用的名称。
      • Wew 恶魔魔法,这是另一个适合我的,按第 3 列排序所有 %sort n /^\([0-9.-]\+\s\+\)\{3}\zs[0-9.-]\ze/
      【解决方案3】:

      使用 awk 将数字键放在前面。 $NF 是当前记录的最后一个字段。种类。使用 sed 删除重复键。

      awk -F, '{ print $NF, $0 }' yourfile | sort -n -k1 | sed 's/^[0-9][0-9]* //'
      

      【讨论】:

        【解决方案4】:

        Perl 单行:

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

        【讨论】:

          【解决方案5】:

          我要把我的扔在这里作为替代品(我无法让 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】:

            Python 单线:

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

            【讨论】:

              猜你喜欢
              • 2017-11-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-12-17
              • 2021-08-25
              相关资源
              最近更新 更多