【问题标题】:Sorting floats with exponents with 'sort -g' bash command使用 'sort -g' bash 命令对浮点数进行排序
【发布时间】:2012-05-05 21:34:50
【问题描述】:

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

【问题讨论】:

  • 你的sort是什么版本的?
  • 它适用于我(GNU 排序)。阅读this,特别注意脚注。
  • potong:谢谢,这解决了问题。似乎我拥有的语言环境(ru_RU.UTF-8)没有将点视为小数分隔符。

标签: bash sorting command-line


【解决方案1】:

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

LC_NUMERIC=en_US.UTF-8

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

sudo gedit /etc/default/locale

就是这样。您也可以通过这样做临时使用此值

LC_ALL=C sort -g file.dat

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

【讨论】:

  • @Teemu 我编辑了这个旧帖子,所以现在应该更合适了:) 我写第一个时没有评论的权限。
  • 是的,最好的一个
【解决方案2】:

你的方法绝对正确

cat file.txt | sort -g

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

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

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

【讨论】:

  • potong 已经在我的问题的评论中解决了我的问题。我拥有的语言环境(ru_RU.UTF-8)不将点视为小数分隔符。解决方案是将 LC_ALL 环境变量设置为“C”。
【解决方案3】:

这是一个巧妙的技巧:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    相关资源
    最近更新 更多