sort 命令的错误行为?

Mak*_*Lee 15 command-line sort

我试图在Ubuntu 桌面 14.04 (Trusty Tahr)中对文件的内容进行排序。就我而言,预期结果应该与原始内容相同,但实际结果却并非如此。为什么?

# cat test.txt
a++-a
a++-b
a++-c
ab
ac
Run Code Online (Sandbox Code Playgroud)
# cat test.txt | sort
a++-a
ab
a++-b
ac
a++-c
Run Code Online (Sandbox Code Playgroud)

c0r*_*0rp 19

您可以使用LC_ALL变量,LC_ALL=C在调用之前将其设置为sort

$ LC_ALL=C sort test.txt
a++-a
a++-b
a++-c
ab
ac
Run Code Online (Sandbox Code Playgroud)

如果您想神奇地知道这是什么,请阅读答案LC_ALL=C。这是简短的总结:

C 语言环境是一种特殊的语言环境,旨在成为最简单的语言环境。您也可以说其他语言环境适用于人类,而 C 语言环境适用于计算机。在 C 语言环境中,字符为单字节,字符集为 ASCII,排序顺序基于字节值。

另外,正如@KenMollerup 所指出的,引用自 man sort

   ***  WARNING  ***  The locale specified by the environment affects sort
   order.  Set LC_ALL=C to get the traditional sort order that uses native
   byte values.
Run Code Online (Sandbox Code Playgroud)

因此,当使用 sort with 时LC_ALL=C,按字节对比较符号进行排序。否则sort将忽略所有非字母数字字符。


Ken*_*rup 8

Sort 使用字母和数字排序,与我们一样,像 + - < > ... 这样的特殊字符被忽略,数字被视为数字所以 1, 2, 3.. 排在 11, 12 1066 1104 之前——看!

所以你的列表被视为:aa, ab, ab, ac, ac

  • 在 man sort 中看到这个: *** WARNING *** 环境指定的语言环境会影响排序顺序。设置 LC_ALL=C 以获取使用本机字节值的传统排序顺序。 (6认同)