排序命令的行为错误吗?

排序命令的行为错误吗?

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

# cat test.txt
a++-a
a++-b
a++-c
ab
ac
# cat test.txt | sort
a++-a
ab
a++-b
ac
a++-c

答案1

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

$ LC_ALL=C sort test.txt
a++-a
a++-b
a++-c
ab
ac

答案,如果你想知道这有什么神奇之处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.

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

答案2

排序使用字母和数字排序,与我们相同,特殊字符如 + - < > ...将被忽略,数字被视为数字,因此 1、2、3.. 位于 11、12 1066 1104 之前 - 看到了吗!

因此您的列表被视为:aa,ab,ab,ac,ac

相关内容