sort命令如何在这种特定情况下工作?

时间:2017-09-02 19:20:02

标签: linux bash sorting

所以我有一个名为sortingnames.txt的文本文件,它在cat命令下看起来像这样。

A. Thaliana
E. Coli
H. sapiens
S. cerevisiae
A thaliana
E Coli
H sapiens
S cerevisiae
A. Thaliana (plant)
E. Coli (Bacteria)
H. Sapiens (Human)
S. Cerevisiae (Yeast)
203 characters?
A. Thaliana Plant

然后我运行sort命令$ sort -k 3.2 sortingnames.txt。 结果会弹出这样的结果。

203 characters
A thaliana
A. Thaliana
E Coli
E. Coli
H sapiens
H. sapiens
S cerevisiae
S. cerevisiae
E. Coli (Bacteria)
H. Sapiens (Human)
A. Thaliana (plant)
A. Thaliana Plant
S. Cerevisiae (Yeast)

最后5行的顺序对我来说没有意义。假设排序没有像标点符号那样(考虑到大肠杆菌(细菌)的第3个字符是c而下一行(人类)是m。植物系的第3个字符是a,而酵母系是a。

但是bash还是会回来的。有人可以解释原因吗?

1 个答案:

答案 0 :(得分:0)

似乎是与en_US.UTF-8相关的归类序列的问题。在这种情况下,左边的paren - ( - 被有效地忽略,最后5行看起来像:

E. Coli Bacteria)
H. Sapiens Human)
A. Thaliana plant)
A. Thaliana Plant
S. Cerevisiae Yeast)

因此,当您应用-k3.2时......请记住,计数中包含前导空格 ...您将获得以下排序结果:

' Bacteria)'
' Human)'
' plant)'
' Plant'
' Yeast)'

当您考虑不区分大小写的排序顺序时,小写优先于大写...结果是正确的... en_US.UTF-8

尝试更改LANG变量,例如unset LANG。在我的SLES环境中,所有LC_*变量都切换到“POSIX”,当我再次运行排序时,我发现左边的paren现在被视为排序字符串的一部分,因此在应用-k3.2时,我得到了:

' (Bacteria)
' (Human)
' (Yeast)
' (plant)
' Plant

...但是在这种情况下,左边的paren优先于字母,我们看到区分大小写的排序,大写优先于小写...对于LANG=(以及各种{{ 1}} variables =“POSIX”)