linux - 在这种特定情况下排序命令如何工作?

标签 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 -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/

相关文章:

linux - Autofs 启动但似乎什么也没做 - 甚至没有记录?

带有 if 子句的 Java 8 比较器

c++ - 如何在 C++ 中对包含 vector<float> 类型的类进行排序?

c++ - 使用/usr/lib/i386-linux-gnu 而不是/usr/lib/x86_64-linux-gnu 在 CMake 中查找库

java - 从java编辑启动脚本

linux - 这个 Bash 函数有语法错误吗?当硬编码到主循环中时,功能可以正常工作

带有管道和标准输入的 Bash 子字符串

linux - shell 脚本中的主机名变量(非 FQDN)

c++ - 从 vector 中获取(下一个)最大对象

javascript - Google 阻止了我的网站 : all *. js 文件被感染。如何找到感染我的 JavaScript 代码的进程?