【问题标题】:Sorting Scientific Number With Unix Sort使用 Unix 排序对科学数字进行排序
【发布时间】:2011-02-08 04:46:28
【问题描述】:

我尝试使用 Unix 排序对这些数字进行排序,但它似乎不起作用:

    2e-13
    1e-91
    2e-13
    1e-104
    3e-19
    9e-99

这是我的命令:

sort -nr file.txt

正确的做法是什么?

【问题讨论】:

  • 使用python,排序,key = lambda x: float(x)。 Python 可用于单行。预装了哪个版本的 Python?
  • @Hamish Grubijan - 您可能应该将其发布为答案,+1。它比依赖 GNU 扩展更便携。

标签: linux unix sorting numbers


【解决方案1】:

只需做两件事:

  1. 使用-g(或--general-numeric-sort)使sort正确处理Exp-numbers。
  2. 使用LC_ALL=C。如果您的数据可能包含一些特定于语言的符号(ASCII 除外),sort 对语言环境非常敏感。因此,使用LC_ALL=C每个使用sort 的情况的通用方法,它使sort 将输入流视为二进制,你不会有任何问题。李>

所以通用的解决方案是:

cat file.txt | LC_ALL=C sort -gr | less

我还在我的.bashrc 文件中为排序创建了别名:

alias csort="LC_ALL=C sort"

方便使用。

【讨论】:

    【解决方案2】:

    好的,这是一个未经过全面测试的 Python 脚本版本。假定用法:

    sort_script.py file.txt
    

    不幸的是,我在 Windows 上开发了这个,并且安装了 2 个不同版本的 Python,我无法正确测试它。警告:需要最新的 Python(添加或更改打印功能)。注意:back_to_file 标志可以是一个可选参数,尽管在 Unix 中你总是可以重定向...即使在 Windows 中你也可以。

    #!/usr/bin/env python3.1
    # Note: requires newer python
    
    import sys
    
    #Remove this line:
    sys.argv = ('', 'file.txt')
    
    assert(len(sys.argv) == 2)
    
    with open(sys.argv[1], 'r') as fin:
        lines = fin.readlines()
    
    lines_sorted = sorted(lines, key=lambda x: float(x))
    
    back_to_file = False # Change this if needed
    
    if back_to_file:
        with open(sys.argv[1], 'w') as fout:
            fout.writelines(lines_sorted)
    else:
        for lns in lines_sorted:
            print(lns, end='') # Suppress new line
    

    【讨论】:

      【解决方案3】:

      如果您的sort 没有-g,另一种方式。

      $ printf "%.200f\n" $(<file) |sort -n |xargs printf "%g\n"
      1e-104
      9e-99
      1e-91
      3e-19
      2e-13
      2e-13
      
      $ sort -g file
      1e-104
      9e-99
      1e-91
      3e-19
      2e-13
      2e-13
      
      $ printf "%.200f\n" `cat file` |sort -n |xargs printf "%g\n"
      

      【讨论】:

        【解决方案4】:

        使用-g(长格式--general-numeric-sort)代替-n-g 选项通过strtod 传递数字以获取它们的值,它会识别这种格式。

        我不确定这是否适用于 sort 的所有实现,或者仅适用于 GNU。

        【讨论】:

        • 我很确定它最初是以 GNU 为中心的,但我想不出现在不提供它的 sort。可能有问题,但我认为只适用于非常旧的系统。
        • 这对我来说没有正确排序 0 和 0.1。必须将 LANG=C 添加到我的管道 ... | LANG=C sort -g
        猜你喜欢
        • 1970-01-01
        • 2023-02-03
        • 1970-01-01
        • 2023-04-04
        • 2010-09-26
        • 2017-09-07
        • 1970-01-01
        • 2011-09-14
        相关资源
        最近更新 更多