用Unix排序科学数字排序

时间:2010-04-15 02:17:28

标签: linux unix sorting numbers

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

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

这是我的命令:

sort -nr file.txt

这样做的正确方法是什么?

4 个答案:

答案 0 :(得分:39)

使用-g(长格--general-numeric-sort)代替-n-g选项将数字传递到strtod以获取其值,并且它将识别此格式。

我不确定这是sort的所有实现,还是只有GNU实现。

答案 1 :(得分:8)

如果您的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"

答案 2 :(得分:4)

做两件事:

  1. 使用-g(或--general-numeric-sort)使sort正确处理Exp-numbers。
  2. 使用LC_ALL=C。如果您的数据可能包含除ASCII之外的某些特定于语言的符号,则sort对语言环境非常敏感。因此,使用LC_ALL=C是使用sort每个情况的通用方法,它使sort将输入流视为二进制,并且您不会&#39 ;有任何问题。
  3. 所以通用解决方案是:

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

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

    alias csort="LC_ALL=C sort"

    方便使用。

答案 3 :(得分:1)

好的,这是一个未完全测试的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