基于绝对值和科学记数法对数字列进行排序

时间:2016-07-19 18:29:10

标签: bash sorting

我有一个带有正数,负数和科学数字的数字的文件,都在同一列中。考虑到科学记数法,我想用数字的绝对值对其进行排序。

例如,请考虑以下文件:

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

由于

3 个答案:

答案 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 }'