我有一个带有正数,负数和科学数字的数字的文件,都在同一列中。考虑到科学记数法,我想用数字的绝对值对其进行排序。
例如,请考虑以下文件:
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
由于
答案 0 :(得分:0)
以下是perl
解决方案,因为我认为在纯bash
中执行此操作并不容易:
perl -e 'print sort { abs($a) <=> abs($b) } <>' foo
答案 1 :(得分:0)
sed 's/^-\(.*\)/\1-/' | sort -g | sed 's/^\(.*\)-$/-\1/'
我们的想法是将每个负数-123
转换为123-
,然后按数字排序(忽略尾随-
),然后撤消转换。
答案 2 :(得分:0)
ruby -e 'puts (IO.readlines "sn.txt").sort_by { |e| e.to_f.abs }'