排序命令的行为错误?


14

我试图对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

4
我因您无用的cat礼物递给您一个小小的奖杯。
David Foerster'3

3
@DavidFoerster的评论是一种有趣的方式,指出您可以替换cat test.txt | sortsort test.txt:)
Volker Siegel

@VolkerSiegel:是的,尽管有一些有用的公式可以cat用来开始。例如,cat FILE | grep dev | sort将仅显示其中带有“ dev”的行(按排序顺序)。使用sort FILE | grep dev产生相同的输出,但有色。
AlainD

Answers:


17

您可以使用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.

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


对不起没看到这个,我对评论做出了反应!
肯·莫勒鲁普

@KenMollerup感谢您指向man sort。我没有注意到
c0rp

8

排序使用字母和数字排序,与我们相同,特殊字符(如+-<> ...)将被忽略,数字被视为数字,因此1,2,3 ..在11、12 1066 1104之前出现-见!

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


是否有任何排序选项,以便它不会忽略特殊字符,以便test.txt将按所需方式排序?
道格·史密斯

6
请以手动排序方式查看此内容:***警告***环境指定的语言环境会影响排序顺序。设置LC_ALL = C可获得使用本机字节值的传统排序顺序。
肯·莫勒鲁普

@KenMollerup,请在您的答案中添加更多信息。从添加报价man sort,添加示例。
c0rp

是的,但是我太慢了,请参阅下面的c0rp答案。
肯·莫勒鲁普
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.