我在Linux和cygwin上都遇到过这种情况,所以我怀疑这不是一个bug。不过,我还是不明白。有人能解释一下吗?
考虑以下文件(制表符分隔,这是一个常规的撇号)(我用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
为什么我必须忽略第二列才能正确排序?
我打开sort
的手册,注意到以下内容:
* WARNING *环境指定的区域设置影响排序秩序。设置LC_ALL=C以获得使用native的传统排序顺序字节值。
事实证明,区域设置实际上指定了字典顺序对给定区域设置的工作方式。这很有意义,但由于某种原因,它会在多字段文件中出错…
(参见:)linux's sort命令的异常行为
如果有尾随字段,为什么sort命令排序不同?
有两件事你可以做:
您可以使用
按字节值进行简单排序LC_ALL="C" sort temp
这将给出一个更合乎逻辑的结果,但它可能不是你真正想要的。
您可以尝试通过将区域设置为C并告诉它您想要字典排序来让sort执行更基本的字典排序:
LC_ALL="C" sort -d temp
要让sort输出您的区域设置信息并突出显示排序键,可以使用
sort --debug temp
就我个人而言,我真的很想知道指定了什么规则,使sort在多个字段中表现得不直观。
它们应该在给定的语言和方言中指定正确的字典顺序。区域设置的函数是否根本不处理多字段的情况,或者它们对该行的"含义"采取了某种不同的解释?