【问题标题】:Unexpected bash sort behavior意外的 bash 排序行为
【发布时间】:2016-11-01 13:39:59
【问题描述】:

如果我创建一个包含以下行的文本文件:

>TESTTEXT_10000000
>TESTTEXT_1000000
>TESTTEXT_10000002
>TESTTEXT_10000001

并执行sort myfile,我的输出是

>TESTTEXT_1000000
>TESTTEXT_10000000
>TESTTEXT_10000001
>TESTTEXT_10000002

但是,如果我将 /1 和 /2 附加到我的行中,排序输出会发生巨大变化,我不知道为什么。

输入:

>TESTTEXT_10000000/1
>TESTTEXT_1000000/1
>TESTTEXT_10000002/1
>TESTTEXT_10000001/1

输出:

>TESTTEXT_10000000/1
>TESTTEXT_1000000/1
>TESTTEXT_10000001/1
>TESTTEXT_10000002/1

输入:

>TESTTEXT_10000000/2
>TESTTEXT_1000000/2
>TESTTEXT_10000002/2
>TESTTEXT_10000001/2

输出:

>TESTTEXT_10000000/2
>TESTTEXT_10000001/2
>TESTTEXT_1000000/2
>TESTTEXT_10000002/2

正斜杠是否被识别为分隔符?使用 --field-sperator 并没有改变行为。如果是这样,为什么 1000000/2 在 1000001/2 和 1000002/2 条目之间?使用人工排序、数字排序或其他选项永远不会带来一致性。有谁能帮帮我吗?

:编辑: 因为似乎相关,考虑到答案,本机上LC_ALL的值为en_GB.UTF-8

【问题讨论】:

  • 试试这个:LC_ALL=C sort file

标签: bash sorting


【解决方案1】:

/ 在您的语言环境中位于 0 之前。使用 LC_ALL=C 或其他语言环境不会正确更改任何内容。

在您的用例中,您可以正确使用-Version 排序:

sort -V myfile

您可以指定要排序的分隔符和键:

sort -t/ -k1,1 myfile

【讨论】:

  • 奇怪的是,LC_ALL=C 确实解决了我的问题并使排序保持一致。但是, sort -V 选项也解决了这个问题,而无需更改语言环境,所以我会接受这个答案。