使用Unixsorting对科学编号进行sorting

我试图用Unixsorting这些数字,但似乎没有工作:

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

这是我的命令:

 sort -nr file.txt 

什么是正确的方法来做到这一点?

Solutions Collecting From Web of "使用Unixsorting对科学编号进行sorting"

使用-g (长格式 – --general-numeric-sort )而不是-n-g选项通过strtod传递数字以获得它们的值,并且它将识别这种格式。

我不确定这是否适用于所有类型的实现,或只是GNU。

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

只要做两件事:

  1. 使用-g (或--general-numeric-sort )可以正确处理Exp数字。
  2. 使用LC_ALL=C 如果您的数据可能包含一些除ASCII以外的特定于语言的符号,则sort对区域设置非常有用。 因此,使用LC_ALL=C每种情况下使用sort的通用方法,它将输入流视为二进制,而不会有任何问题。

所以通用的解决方案是:

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

另外我在我的.bashrc文件中做了一个别名:

alias csort="LC_ALL=C sort"

非常方便的使用。

好的,这是一个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