“sort -g”对科学记数法的数据没有按预期工作

Luk*_*chs 7 sort locale numeric-data

我正在尝试按降序对数据文件进行排序。数据文件由由制表符分隔的三列给出;我想对第三列按降序对它们进行排序(第三列作为指数值的科学记数法给出):

cat eII_surf.txt | sort -gr -k3
Run Code Online (Sandbox Code Playgroud)

不知何故,这在以前的机器上有效,但我的新机器似乎根本不起作用。

这里有一个简单的例子:

cat test.txt

6.7 2.3e-12
5.0 3.4e-18
4.5 5.6e-16
4.2 2.1e-15
4.0 2.9e-17
2.4 2.5e-15
1.0 1.0e-17
0.5 1.0e-18
Run Code Online (Sandbox Code Playgroud)

cat test.txt | sort -gr -k2

4.5 5.6e-16
5.0 3.4e-18
6.7 2.3e-12
4.2 2.1e-15
4.0 2.9e-17
2.4 2.5e-15
1.0 1.0e-17
0.5 1.0e-18
Run Code Online (Sandbox Code Playgroud)

这是输出locale

LANG=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC=de_DE.utf8
LC_TIME=de_DE.utf8
LC_COLLATE="en_US.utf8"
LC_MONETARY=de_DE.utf8
LC_MESSAGES="en_US.utf8"
LC_PAPER=de_DE.utf8
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT=de_DE.utf8
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 11

2.3e-12将被理解为2在十进制基数字符所在的区域设置中,(在大多数非英语世界中,包括您的de_DE.utf8),其中需要写入数字2,3e-12

你可以这样做:

LC_ALL=C sort -grk2 < your-file
Run Code Online (Sandbox Code Playgroud)

强制以英文风格解释数字。

在 C 语言环境(您可以保证在任何系统上都能找到的唯一语言环境)中,十进制基数是.(方便您的输入)。

请注意,sort与 无关bash,它是一个单独的命令。该-g选项是 GNU 实现的非标准扩展sort

  • @LukasFuchs,不,我不会。您只想将`LC_ALL=C` 用于您不希望行为受到用户本地化首选项影响的命令。参见[什么是“LC\_ALL=C”?](//unix.stackexchange.com/a/87763) (6认同)
  • 谢谢!那一个似乎有效。您是否建议在 bashrc 中将 LC_ALL=C 设置为新的环境变量? (3认同)