我想对具有以下内容的文件名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设置都是相同的。 是由于特殊字符造成的吗?
有人可以解释这是怎么回事。
答案 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
吗?