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

8

我有一个带指数的浮点数文件,我想对它们进行排序。据我所知,“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 版本是多少? - kev
1
它对我有效(GNU sort)。阅读此文,特别注意脚注。 - potong
potong:谢谢,问题解决了。看起来我的语言环境(ru_RU.UTF-8)不把点作为小数分隔符。 - Alex Bochkarev
3个回答

9

问题在于,在某些国家,本地设置可能会将系统级别的小数点分隔符 . 替换为 , ,从而导致此问题。在终端中键入 locale 进行检查。应该会出现以下条目:

LC_NUMERIC=en_US.UTF-8

如果该值为其他任何值,请通过编辑本地语言文件将其更改为上述值。
sudo gedit /etc/default/locale

就是这样了。您也可以通过以下方式暂时使用该值

LC_ALL=C sort -g file.dat

LC_ALL=C 在终端中更短,但将其放入区域设置文件可能不是首选,因为它可能会改变其他系统范围的行为,例如时间格式。


@Teemu 我编辑了这篇旧帖子,现在应该更合适了:) 当我写第一篇评论时,我没有获得许可。 - Jonatan Öström
是的,这是最好的一个。 - 42n4

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

3
你的方法绝对正确。
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”。 - Alex Bochkarev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接