根据绝对值和科学记数法对数字列进行排序

  • 本文关键字:数字 排序 绝对值 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

感谢

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

最新更新