我想要对数据列表进行排序,并打算根据其第一列(即 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
(至少不是 asLC_NUMERIC
)。第二台机器不用作.
千位分隔符。