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命令执行的环境.你应该对此有相同的行为.
这可能是由区域设置差异引起的。在en_US.UTF-8语言环境中,下划线 ( _) 在字母和数字之后排序,而在POSIXC语言环境中,它们在大写字母和数字之后排序,但在小写字母之前排序。
# won\'t change LC_COLLATE=C after execution\n$ LC_COLLATE=C sort filename\nRun Code Online (Sandbox Code Playgroud)\n您还可以用来sort --debug显示有关一般排序行为的更多信息:
$ (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\nRun Code Online (Sandbox Code Playgroud)\n正如此答案所示,您可以使用上面的公式强制LC_COLLATE=C执行单个命令,而无需修改您的 shell 环境:
| 归档时间: |
|
| 查看次数: |
8277 次 |
| 最近记录: |