我有一个文件,里面有正数、负数和科学记数法中的数字,都在同一列中。考虑到科学记数法,我想按数字的绝对值排序。
例如,考虑以下文件:
cat foo
7.70488617137843e-05
-8.50387220311822
0.1
-3.3453262e-02
我试过:
sort foo
0.1
-3.3453262e-02
7.70488617137843e-05
-8.50387220311822
这将正数和负数视为相同的(=绝对值,我想要);但忽略了科学记数法。
sort -n foo
-8.50387220311822
-3.3453262e-02
0.1
7.70488617137843e-05
这尊重积极和消极的价值观,而忽略了科学的符号。这与我想要的正好相反。
sort -g foo
-8.50387220311822
-3.3453262e-02
7.70488617137843e-05
0.1
这尊重科学符号(我想要),但也尊重积极和消极的价值观。
我想要的输出看起来像:
7.70488617137843e-05
-3.3453262e-02
0.1
-8.50387220311822
这尊重科学记数法,但对正数和负数一视同仁。
我看过分拣文件,但找不到答案。
我使用bash版本4.1.2
感谢
sed 's/^-(.*)/1-/' | sort -g | sed 's/^(.*)-$/-1/'
其思想是将每个负数-123
转换为123-
,然后进行数字排序(忽略后面的-
),然后撤消转换。
这里有一个perl
解决方案,因为我认为在纯bash
:中执行它并不容易
perl -e 'print sort { abs($a) <=> abs($b) } <>' foo
ruby -e 'puts (IO.readlines "sn.txt").sort_by { |e| e.to_f.abs }'