unix 排序为不同的用户提供不同的结果
unix sort is giving different results for different users
我想用以下内容对文件名 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
当我尝试 sort -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 排序命令会给出两个不同的结果。甚至 cshrc 设置都是相同的。
是因为特殊字符吗?
谁能解释一下这里出了什么问题。
sort
不同行为的根本原因是 LC_COLLATE
的值。 man 7 locale
的输出表示:
LC_COLLATE
This category governs the collation rules used for sorting and regular
expressions, including character equivalence classes and
multicharacter collating elements. This locale category changes the
behavior of the functions strcoll(3)
and strxfrm(3)
, which are used
to compare strings in the local alphabet. For example, the German
sharp s is sorted as "ss".
我对 sort
source code 的(非常快的)分析是,它转换要使用 strxfrm()
排序的文本行以获得 比较基础, 所以那个字节
即使它们的字节不同 (原文如此).
关于您仍然得到相同输出的事实,正如@Amadan 所说,这很奇怪。您确定您已正确设置语言环境吗?你可以试试 LC_COLLATE="C" sort -ru your_file
。
我想用以下内容对文件名 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
当我尝试 sort -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 排序命令会给出两个不同的结果。甚至 cshrc 设置都是相同的。 是因为特殊字符吗?
谁能解释一下这里出了什么问题。
sort
不同行为的根本原因是 LC_COLLATE
的值。 man 7 locale
的输出表示:
LC_COLLATE
This category governs the collation rules used for sorting and regular expressions, including character equivalence classes and multicharacter collating elements. This locale category changes the behavior of the functions
strcoll(3)
andstrxfrm(3)
, which are used to compare strings in the local alphabet. For example, the German sharp s is sorted as "ss".
我对 sort
source code 的(非常快的)分析是,它转换要使用 strxfrm()
排序的文本行以获得 比较基础, 所以那个字节
即使它们的字节不同 (原文如此).
关于您仍然得到相同输出的事实,正如@Amadan 所说,这很奇怪。您确定您已正确设置语言环境吗?你可以试试 LC_COLLATE="C" sort -ru your_file
。