Unix排序处理下划线字符

21 unix sorting collation environment-variables

我有两台linux机器,unix排序似乎表现不同.我相信我已经把它缩小到对下划线角色的处理.

如果我运行sort tmp,其中tmp包含以下两行:

aa_d_hh
aa_dh_ey
Run Code Online (Sandbox Code Playgroud)

一台机器输出

aa_d_hh
aa_dh_ey
Run Code Online (Sandbox Code Playgroud)

(即'_'在'h'之前),而其他输出

aa_dh_ey
aa_d_hh
Run Code Online (Sandbox Code Playgroud)

(即'h'在'_'之前).我需要这些机器一起运行(因为我稍后使用sort -m来合并非常大的文件).

有什么方法可以强制排序以某种方式表现吗?

谢谢.

Meh*_*gut 27

您可以LC_COLLATE为命令设置传统排序顺序:

env LC_COLLATE=C sort tmp
Run Code Online (Sandbox Code Playgroud)

这不会改变当前环境只是sort命令执行的环境.你应该对此有相同的行为.


Dan*_*ski 8

这可能是由区域设置差异引起的。在en_US.UTF-8语言环境中,下划线 ( _) 在字母和数字之后排序,而在POSIXC语言环境中,它们在大写字母和数字之后排序,但在小写字母之前排序。

\n
# won\'t change LC_COLLATE=C after execution\n$ LC_COLLATE=C sort filename\n
Run Code Online (Sandbox Code Playgroud)\n

您还可以用来sort --debug显示有关一般排序行为的更多信息:

\n
$ (echo \'foo_bar\'; echo \'fooAbar\'; echo \'foo0bar\'; echo \'fooabar\') |\n      LC_COLLATE=en_US.UTF-8 sort --debug\nsort: using \xe2\x80\x98en_US.UTF-8\xe2\x80\x99 sorting rules\nfoo0bar\nfooabar\nfooAbar\nfoo_bar\n\n$ (echo \'foo_bar\'; echo \'fooAbar\'; echo \'foo0bar\'; echo \'fooabar\') | \n      LC_COLLATE=C sort --debug\nsort: using simple byte comparison\nfoo0bar\nfooAbar\nfoo_bar\nfooabar\n
Run Code Online (Sandbox Code Playgroud)\n

正如此答案所示,您可以使用上面的公式强制LC_COLLATE=C执行单个命令,而无需修改您的 shell 环境:

\n