Unix排序为不同的用户提供不同的结果

时间:2019-03-08 10:21:16

标签: sorting unix csh

我想对具有以下内容的文件名reportA进行排序

pat_int_parallel_all


/projects/test
-v ../../../../../../te
min_custom.v
-v ../../../../../../tes
-y ../../../../../../test_
-y ../../../../../../test_lib/test
../../../../../../tesla
/projects/checklist
../../../../../../test_lib/LIB
../../../../../../telib/av
../../../../../../telib/te
+libext+.v
+incdir+/projectsst_relea/ana

当我尝试对-u -r reportA> output进行排序时。 我得到了这个结果

-y ../../../../../../test_lib/test
-y ../../../../../../test_
-v ../../../../../../tes
-v ../../../../../../te 
../../../../../../test_lib/LIB
../../../../../../test 
../../../../../../telib/te
../../../../../../telib/av
/projects/test /projects/checklist 
pat_int_parallel_all min_custom.v
+libext+.v
+incdir+/projectsst_relea/ana

我的语言环境输出为 en_US

LANG=en_US
LC_CTYPE="en_US"
LC_NUMERIC="en_US"
LC_TIME="en_US"
LC_COLLATE="en_US"
LC_MONETARY="en_US"
LC_MESSAGES="en_US"
LC_PAPER="en_US"
LC_NAME="en_US"
LC_ADDRESS="en_US"
LC_TELEPHONE="en_US"
LC_MEASUREMENT="en_US"
LC_IDENTIFICATION="en_US"
LC_ALL=

但是对于其他使用相同排序命令的用户,结果却不同。

pat_int_parallel_all
min_custom.v
/projects/test
/projects/checklist
../../../../../../test_lib/LIB
../../../../../../tesla
../../../../../../telib/te
../../../../../../telib/av
-y ../../../../../../test_lib/test
-y ../../../../../../test_
-v ../../../../../../tes
-v ../../../../../../te
+libext+.v
+incdir+/projectsst_relea/ana

我的朋友的语言环境输出为 C

LANG=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=C 

我想知道为什么当我的别名,SHELL版本与其他用户相同时,普通的uinx sort命令为什么会给出两个不同的结果。甚至cshrc设置都是相同的。 是由于特殊字符造成的吗?

有人可以解释这是怎么回事。

1 个答案:

答案 0 :(得分:1)

sort行为不同的根本原因是LC_COLLATE的值。 man 7 locale的输出显示:

  

LC_COLLATE

     

此类别控制用于排序和常规的排序规则   表达式,包括字符等效类和   多字符整理元素。此语言环境类别更改了   函数strcoll(3)strxfrm(3)的行为   比较本地字母中的字符串。例如,德国人   尖锐的s排序为“ ss”。

我对sort source code的分析(非常快速)是,它转换了要用strxfrm()进行排序的文本行,以得到比较的基础,因此该字节 即使字节数不同,否则原本应视为相等的字符串也被视为相等。

(原文如此)。

关于您仍然获得相同输出的事实,就像@Amadan所说的那样,很奇怪。您确定已正确设置语言环境吗?您可以尝试LC_COLLATE="C" sort -ru your_file吗?