Unix下划线字符排序处理

问题描述 投票:22回答:5

我有两台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合并非常大的文件)。

有什么方法可以强制排序以一种或另一种方式运行?

谢谢。

sorting unix environment-variables collation
5个回答
28
投票

您可以仅根据命令将LC_COLLATE设置为传统排序顺序:

env LC_COLLATE=C sort tmp

这不会仅改变当前执行sort命令的环境。您应该对此具有相同的行为。


4
投票

排序顺序取决于环境变量LC_COLLATE的当前值。检查本地文档中的'locale','setlocale'等。在两台机器上将LC_COLLATE设置为'POSIX',并且结果应该匹配。


2
投票

这可能是由于地区差异引起的。在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环境:


0
投票

差异是由于您的LC_COLLATE=C。使用locale命令检查当前设置。

[有许多不同的语言环境类别,例如localelocaleLC_COLLATE。您可以通过设置环境变量LC_TIMELC_MESSAGES来全部更改它们,或者通过设置环境变量LC_ALL仅更改排序规则(排序)顺序。语言环境LANGLC_COLLATE是标准定义的基本语言环境;其他包括C(美国英语),POSIX(法语)等)>


0
投票

我真的很喜欢上面给出有用示例的答案,我只是将另一个字符串添加到其列表中,以便您可以看到在许多标准POSIX安装中在此语言环境中如何处理下划线:

© www.soinside.com 2019 - 2024. All rights reserved.