我有两台linux机器,其unix排序似乎表现不同。我相信我已将其范围缩小到下划线字符的处理。
如果我运行sort tmp
,其中tmp包含以下两行:
aa_d_hh
aa_dh_ey
一个机器输出
aa_d_hh
aa_dh_ey
(即'_'在'h'之前,而其他输出
aa_dh_ey
aa_d_hh
(即'h'在'_'之前)。我需要这些机器一起工作(稍后我将使用sort -m合并非常大的文件)。
有什么方法可以强制排序以一种或另一种方式运行?
谢谢。
您可以仅根据命令将LC_COLLATE
设置为传统排序顺序:
env LC_COLLATE=C sort tmp
这不会仅改变当前执行sort命令的环境。您应该对此具有相同的行为。
排序顺序取决于环境变量LC_COLLATE的当前值。检查本地文档中的'locale','setlocale'等。在两台机器上将LC_COLLATE设置为'POSIX',并且结果应该匹配。
这可能是由于地区差异引起的。在en_US.UTF-8
语言环境中,下划线(_
)在字母和数字之后排序,而在POSIX C
locale中,它们在大写字母和数字之后排序,但before小写数字。
C
您也可以使用# won't change LC_COLLATE=C after execution
$ LC_COLLATE=C sort filename
显示有关一般排序行为的更多信息:
sort --debug
也如$ (echo 'foo_bar'; echo 'fooAbar'; echo 'foo0bar'; echo 'fooabar') |
LC_COLLATE=en_US.UTF-8 sort --debug
sort: using ‘en_US.UTF-8’ sorting rules
foo0bar
fooabar
fooAbar
foo_bar
$ (echo 'foo_bar'; echo 'fooAbar'; echo 'foo0bar'; echo 'fooabar') |
LC_COLLATE=C sort --debug
sort: using simple byte comparison
foo0bar
fooAbar
foo_bar
fooabar
中所示,您可以使用以上公式对单个命令强制使用this answer,而无需修改shell环境:
我真的很喜欢上面给出有用示例的答案,我只是将另一个字符串添加到其列表中,以便您可以看到在许多标准POSIX安装中在此语言环境中如何处理下划线: