我尝试用Unix排序对这些数字进行排序,但它似乎不起作用:
2e-13
1e-91
2e-13
1e-104
3e-19
9e-99
这是我的命令:
sort -nr file.txt
这样做的正确方法是什么?
答案 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)
做两件事:
-g
(或--general-numeric-sort
)使sort
正确处理Exp-numbers。LC_ALL=C
。如果您的数据可能包含除ASCII之外的某些特定于语言的符号,则sort
对语言环境非常敏感。因此,使用LC_ALL=C
是使用sort
的每个情况的通用方法,它使sort
将输入流视为二进制,并且您不会&#39 ;有任何问题。所以通用解决方案是:
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