8

我有一个带有指数的浮点数的文件,我想对它们进行排序。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 命令对文件进行排序?
4

3 回答 3

9

这是一个巧妙的技巧:

$ 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命令。

于 2015-01-30T15:37:16.137 回答
8

,问题在于,在某些国家/地区,本地设置可能会通过将其用作小数点分隔符而不是.在系统级别上来搞砸。通过输入locale终端检查。应该有入口

LC_NUMERIC=en_US.UTF-8

如果该值是其他值,则通过编辑语言环境文件将其更改为上述值

sudo gedit /etc/default/locale

而已。您也可以通过执行临时使用此值

LC_ALL=C sort -g file.dat

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

于 2015-01-30T15:13:47.773 回答
4

你的方法绝对正确

cat file.txt | sort -g

如果上面的代码不起作用,那么试试这个

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

兑换 '。' 到 '0000000000000' ,排序并再次替换为 '.'。我选择了'0000000000000'来替换,以避免数字与输入不匹配。您可以自己操作号码。

于 2012-04-26T10:13:44.843 回答