使用'sort -g'bash命令对带有指数的浮点数进行排序

时间:2012-04-25 07:58:37

标签: bash sorting command-line

我有一个带有指数浮点数的文件,我想对它们进行排序。 AFAIK'sort -g'是我需要的。但看起来好像是浮子扔掉了所有的指数。所以输出看起来像这样(这不是我想要的):

$ cat file.txt | sort -g
8.387280091e-05
8.391373668e-05
8.461754562e-07
8.547354437e-05
8.831553093e-06
8.936111118e-05
8.959458896e-07

这让我有两个问题:

  1. 为什么'sort -g'不能正常工作?
  2. 如何使用bash命令对文件进行排序?

3 个答案:

答案 0 :(得分:6)

问题在于,在某些国家/地区,本地设置可能会在系统级别使用,作为小数点分隔符而非.来解决此问题。在终端中输入locale进行检查。应该有一个条目

LC_NUMERIC=en_US.UTF-8

如果值是其他任何值,请通过编辑区域设置文件

将其更改为上述值
sudo gedit /etc/default/locale

就是这样。您也可以通过执行

暂时使用此值
LC_ALL=C sort -g file.dat

LC_ALL=C在终端中写入时间较短,但将其放在语言环境文件中可能不是优选的,因为它可能会改变一些其他系统范围的行为,例如时间格式。

答案 1 :(得分:6)

这是一个巧妙的伎俩:

$ sort -te -k2,2n -k1,1n test.txt 
8.461754562e-07
8.959458896e-07
8.831553093e-06
8.387280091e-05
8.391373668e-05
8.547354437e-05
8.936111118e-05

-te将您的号码划分为两个字段,e将尾数与指数分开。 -k2,2表示首先按指数排序,然后-k1,1表示按照你的尾数进行排序。

适用于sort命令的所有版本。

答案 2 :(得分:4)

你的方法绝对正确

cat file.txt | sort -g

如果上述代码无效,请尝试此

sed 's/\./0000000000000/g' file.txt | sort -g | sed 's/0000000000000/\./g'

转换'。'到'0000000000000',排序并再次替换为'。'。我选择“0000000000000”进行替换,以避免数字与输入不匹配。 您可以自己操纵数字。