GNU coreutils `sort` 的行为不同

GNU coreutils `sort` 的行为不同

我想要对数据列表进行排序,并打算根据其第一列(即 IP 地址)对其进行排序。

192.168.1.100
192.168.1.101
192.168.1.110
192.168.1.119
192.168.1.20
192.168.1.30
192.168.1.33
192.168.1.54
192.168.1.64
192.168.1.6
192.168.1.91

在我的第一台机器上,我进行了测试sort -n,它按我预期的方式运行

# coreutils, version: 8.31, release: 23

192.168.1.6
192.168.1.20
192.168.1.30
192.168.1.33
192.168.1.54
192.168.1.64
192.168.1.91
192.168.1.100
192.168.1.101
192.168.1.110
192.168.1.119

但在我的第二台机器上,它无法正确排序

# coreutils, version:8.4

192.168.1.100
192.168.1.101
192.168.1.110
192.168.1.119
192.168.1.20
192.168.1.30
192.168.1.33
192.168.1.54
192.168.1.6
192.168.1.64
192.168.1.91

两台机器具有相同的区域设置en_US.UTF-8


为什么会发生这种情况?我该如何解决?

答案1

如果没有正确的关键位置,则sort使用整行作为关键。由于在所有行中,前三个八位位组保持相同,因此整个排序基于最后一个八位位组中第一个字符的数字位置。由于1出现在2带有 的八位字节之前100,因此101出现在其他八位字节之前。

定义正确的关键位置并使用数字排序。例如,在您的情况下,将输入的分隔符设置为.并让其sort仅在第四个字段上发挥作用。这些4,4方法从由第 4 个字段界定的第 4 个字段开始.,并在同一个第 4 个字段处停止。

sort -n -t'.' -k4,4 file

您还可以覆盖系统中定义的任何其他设置,并直接在命令本地locale使用系统的默认设置。LC_ALL=C有什么LC_ALL=C作用?理解为什么

LC_ALL=C sort -n -t'.' -k4,4 file

谢谢卡米尔·马乔罗夫斯基的评论这突出了实际问题。

第一台机器似乎正在使用locale thousands_sep返回的区域设置.可能不是en_US.UTF-8(至少不是 as LC_NUMERIC)。第二台机器不用作.千位分隔符。

相关内容