因此,我有一个名为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行的排序对我来说没有意义。假设排序不包含()的标点符号,则大肠杆菌(细菌)的第3个字符为c,人类(人类)的下一行为m。植物株系的第3个字符为a,而酵母株系的第3个字符为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 - 在这种特定情况下,sort命令如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46017349/

10-11 04:51