用Unix排序科学数字排序

nev*_*int 19 unix linux sorting numbers

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

    2e-13
    1e-91
    2e-13
    1e-104
    3e-19
    9e-99
Run Code Online (Sandbox Code Playgroud)

这是我的命令:

sort -nr file.txt
Run Code Online (Sandbox Code Playgroud)

什么是正确的方法呢?

Tyl*_*nry 39

使用-g(长格式--general-numeric-sort)代替-n.该-g选项传递数字strtod以获取它们的值,它将识别此格式.

我不确定这是否适用于所有实现sort,或只是GNU实现.

  • 这对我来说没有正确排序 0 和 0.1 。必须将 LANG=C 添加到我的管道 `... | LANG=C 排序 -g` (2认同)

gho*_*g74 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"
Run Code Online (Sandbox Code Playgroud)


Ale*_*hek 5

只需做两件事:

  1. 使用-g(或--general-numeric-sortsort正确处理Exp编号。
  2. 使用LC_ALL=C。该sort是非常明智的语言环境,如果你的数据可能包含不同的ASCII一些语言相关的符号。因此,LC_ALL=C对于您使用的每种情况,使用 都是通用的方法sort,它可以sort将输入流视为二进制,并且不会有任何问题。

因此,通用解决方案是:

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

我也为.bashrc文件中的排序做了一个别名:

alias csort="LC_ALL=C sort"

方便使用。