我注意到下面的排序输出。谁知道为什么“.”第一次在前面排序,第二次在最后排序?
我试着调试一个在一个大的排序文件中查找行的程序,但罪魁祸首似乎是我对linux排序的期望/理解。

$ sort --debug
sort: using ‘en_US.UTF-8’ sorting rules
/mnt/x/E
/mnt/x/.
<ctrl-D>
/mnt/x/.
________
/mnt/x/E
________
$ sort --debug
sort: using ‘en_US.UTF-8’ sorting rules
/mnt/x/Ed
/mnt/x/.T
<ctrl-D>
/mnt/x/Ed
_________
/mnt/x/.T
_________
$

最佳答案

不是“.”在其他字符之前或之后出现,而是根本没有检查它;它只是根据字母字符进行排序。
在第一个示例中,<end-of-string>E之前排序;在第二个示例中,ET之前排序。
此行为取决于排序规则的区域设置。您可以使用环境变量(如LC_COLLATE)来影响它:

$ env LC_COLLATE=C sort
/mnt/x/Ed
/mnt/x/.T
^D
/mnt/x/.T
/mnt/x/Ed
$ env LC_COLLATE=en_US.UTF-8 sort
/mnt/x/Ed
/mnt/x/.T
^D
/mnt/x/Ed
/mnt/x/.T
$

C语言环境下,所有的ascii字符都会被考虑,并按照它们的ascii顺序进行排序;在许多其他语言环境中,标点符号都会被忽略——这大概就是导致您看到的行为的原因。
您可以使用locale命令检查您的区域设置。

关于linux - 我不理解的Linux排序顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28874803/

10-15 01:13