Sort有时会忽略撇号(除非它是唯一使用的列);为什么

  • 本文关键字:唯一 Sort shell sorting locale behavior
  • 更新时间 :
  • 英文 :


我在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在多个字段中表现得不直观。

它们应该在给定的语言和方言中指定正确的字典顺序。区域设置的函数是否根本不处理多字段的情况,或者它们对该行的"含义"采取了某种不同的解释?

最新更新