【问题标题】:sort not sorting as expected (space and locale)排序未按预期排序(空格和语言环境)
【发布时间】:2011-08-20 01:06:08
【问题描述】:

我想通过linuxsort对一个文本文件进行排序,看起来像这样

v 1006
v10 1
v 1011

我希望得到这样的结果:

v 1006
v 1011
v10 1

但是,使用sort,即使有各种选项,v10 1 行仍然在中间。为什么?我会理解v10 1 要么在顶部,要么在底部(取决于空格字符是小于还是大于1),但是出于什么原因将其保留在中间?

【问题讨论】:

    标签: linux sorting


    【解决方案1】:

    您的语言环境会影响行的排序方式。例如,我用我当前的语言环境得到这个:

    % echo -e "v 1006\nv10 1\nv 1011" | sort
    v 1006
    v10 1
    v 1011
    

    但是使用 C 语言环境我得到了这个:

    % echo -e "v 1006\nv10 1\nv 1011" | LC_ALL=C sort
    v 1006
    v 1011
    v10 1
    

    我不确定它为什么会这样。 LC_ALL=C 几乎等同于关闭所有意外处理并返回字节级操作(是的 - 我跳过了细节)。

    为什么不同的语言环境设置会跳过空格很难解释。如果有人能解释一下就好了:)

    【讨论】:

      【解决方案2】:

      它使用系统语言环境来确定字母的排序顺序。我的猜测是,使用您的语言环境,它会忽略空格。

      $ cat foo.txt 
      v 1006
      v10 1
      v 1011
      $ LC_ALL=C sort foo.txt
      v 1006
      v 1011
      v10 1
      $ LC_ALL=en_US.utf8 sort foo.txt
      v 1006
      v10 1
      v 1011
      

      【讨论】:

      • 只是一个小注释,您不需要将; 放入LC_ALL=en_US.utf8 ; sort foo.txt。不过行为上还是有区别的。如果您执行SOME_VAR=foo some_command parameters,您正在执行 some_command 及其参数,并且环境变量 SOME_VAR 等于 foo,但仅针对此命令。如果返回shell后你echo $SOME_VAR,它会有原来的值,而不是foo
      • 哦。好的,我现在明白了。但是....完全忽略空格的要点是什么?
      • 为什么 -k 似乎尊重 LC_ALL=en_US.utf8 中的空格?例如LC_ALL=en_US.utf8 sort -k1,1 foo.txt 给出与 LC_ALL=C sort foo.txt 相同的行为
      猜你喜欢
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多