【问题标题】:unexpected result from gnu sortgnu 排序的意外结果
【发布时间】:2014-01-22 21:54:21
【问题描述】:

当我尝试对以下文本文件“输入”进行排序时:

test1 3   
test3 2
test 4

用命令

sort input

输出就是输入。这是

的输出
od -bc input

0000000 164 145 163 164 061 011 063 012 164 145 163 164 063 011 062 012
          t   e   s   t   1  \t   3  \n   t   e   s   t   3  \t   2  \n
0000020 164 145 163 164 011 064 012
          t   e   s   t  \t   4  \n
0000027

它只是一个包含两列的制表符分隔文件。当我这样做时

sort -k 2

输出变为

test3 2
test1 3
test 4

这是我所期望的。但是如果我这样做了

sort -k 1

输入没有任何变化,而我希望“test”在“test1”之前排序。最后,如果我这样做了

cat input | cut -f 1 | sort

我明白了

test
test1
test3

正如预期的那样。对此有合乎逻辑的解释吗?默认情况下 sort 到底应该做什么,例如:

sort -k 1

?

我的排序版本:

sort (GNU coreutils) 7.4

【问题讨论】:

  • 即使使用自然排序算法,输入(如图所示)已经排序。

标签: sorting unix gnu-sort


【解决方案1】:

来自手册页:

* WARNING * 环境指定的语言环境会影响 种类 命令。设置 LC_ALL=C 以获得使用的传统排序顺序 本国的 字节值。

看来 export LC_ALL=C 必须有帮助

【讨论】:

  • 使用 LC_ALL=C 的 GNU 排序确实产生了传统的答案——这就是 Solaris 上的“排序”无论如何都会产生的结果。将“test3”行更改为“Test3”,您将获得更多差异。 GNU 的答案与“ls”的排序顺序一致。不过,这令人惊讶。
  • 谢谢,对我来说,它也产生了预期的结果。但是,在我的默认语言环境 en_US.UTF-8 中,制表符和空格也都排在 alhpanumeric 字符之前。如果 sort 只是对整行进行字典排序,那对我来说也有点令人惊讶。
猜你喜欢
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 2012-04-03
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多