所以我有一个名为 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 -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 行的顺序对我来说没有意义。假设排序不考虑 ( 等标点符号,则大肠杆菌(细菌)的第三个字符是 c,(人类)的下一行是 m。植物系的第三个字符是 a,酵母系的第三个字符是 a。
然而 bash 返回了这个。有人能解释一下为什么吗?
最佳答案
似乎是与 en_US.UTF-8
相关的整理序列存在问题。在这种情况下,左括号 - (
- 被有效地忽略,最后 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”,当我再次运行排序时,我发现左括号现在被视为排序字符串的一部分,因此在应用 -k3.2
时我得到:
' (Bacteria)
' (Human)
' (Yeast)
' (plant)
' Plant
...但在这种情况下,左括号优先于字母,并且我们看到区分大小写的排序,大写字母优先于小写字母...对于LANG=
(以及各种LC_*
变量=“POSIX”)
关于linux - 在这种特定情况下排序命令如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46017349/