-1

这在 Linux 和 cygwin 上都发生在我身上,所以我怀疑这不是一个错误。不过,我还是不明白。谁能解释一下?

考虑以下文件(制表符分隔,这是一个常规撇号)(我创建它cat以确保它不是问题的根源不是非打印字符)

$cat > temp
cat     1389
cat'    1747
ca't    3175
cat     46848484
ca't    720

$sort temp
<gives the exact same output as cat temp>

$sort -k1,1 temp
cat     1389
cat     46848484
cat'    1747
ca't    3456
ca't    720

为什么我必须忽略第二列才能正确排序?

4

1 回答 1

4

我拿出手册sort并注意到以下内容:

* 警告 * 环境指定的语言环境会影响排序顺序。设置 LC_ALL=C 以获得使用本机字节值的传统排序顺序。

事实证明,语言环境实际上指定了字典顺序对于给定语言环境的工作方式。这很有意义,但由于某种原因,它会遍历多字段文件......

(另见:)
linux 排序命令的异常行为
如果有尾随字段,为什么排序命令排序不同?

您可以做几件事:

您可以使用按字节值天真地排序

LC_ALL="C" sort temp

这将给出一个更合乎逻辑的结果,但它可能不是您真正想要的结果。

您可以尝试通过将语言环境设置为 C 并告诉它您想要字典排序来进行更基本的字典排序:

LC_ALL="C" sort -d temp

要排序输出您的语言环境信息并突出显示排序键,您可以使用

sort --debug temp




就个人而言,我真的很想知道正在指定什么规则使排序在多个字段中表现得不直观。

他们应该在给定的语言和方言中指定正确的词典顺序。语言环境的功能根本不处理多字段情况,还是对行的“含义”采取某种不同的解释?

于 2013-04-05T03:02:47.090 回答