【问题标题】:weird sorting order leading to wrong results [closed]导致错误结果的奇怪排序顺序[关闭]
【发布时间】:2021-11-24 01:58:46
【问题描述】:

comm 提示已排序的文本未排序,sort 给出错误结果。例如,

printf 'G.EC\nGE.BO\nGE.DA\n' | sort

输出

GE.BOAB
G.ECH
GE.DAG

其他例子是ls的输出,

STATIONS_1800
stations.1800.txt
STATIONS.50d
STATIONS.D01
STATIONS.D16
stations.e2008.txt

应该是

STATIONS_1800
STATIONS.50d
STATIONS.D01
STATIONS.D16
stations.1800.txt
stations.e2008.txt

env | grep 'LC\|LANG' 的输出是

LANGUAGE=en_GB.UTF-8
LC_ADDRESS=en_GB.UTF-8
LC_NAME=en_GB.UTF-8
LC_MONETARY=en_GB.UTF-8
LC_PAPER=en_GB.UTF-8
LANG=en_GB.UTF-8
LC_IDENTIFICATION=en_GB.UTF-8
LC_TELEPHONE=en_GB.UTF-8
LC_MEASUREMENT=en_GB.UTF-8
LC_TIME=en_GB.UTF-8
LC_COLLATE=en_GB.UTF-8
LC_NUMERIC=en_GB.UTF-8

在另一台具有相同LC*LANG* 的机器上,排序工作完美。

【问题讨论】:

  • 问题是什么?您可以通过管道|sort 对输出进行排序
  • @Tranbi 命令不正确,因此命令sortcomm 给出错误结果
  • 对于投票结束的人,请再次阅读 Q。这不是一个小问题。确实带来了麻烦。
  • 哦,我明白了。你试过吗? stackoverflow.com/a/8895544/13525512
  • @Tranbi LANG=C 没有变化。事实上,我在做这个 Q 之前用谷歌搜索过,但没有找到任何相关的东西。这很奇怪,因为几小时前一切都很好。唯一可能相关的是我在我的 ubuntu 18.04 上运行了 sudo apt upgrade。但很难验证。

标签: bash shell sorting


【解决方案1】:

设置LC_COLLATE=C

$ printf 'G.EC\nGE.BO\nGE.DA\n' | sort
GE.BO
G.EC
GE.DA

$ printf 'G.EC\nGE.BO\nGE.DA\n' | LC_COLLATE=C sort
G.EC
GE.BO
GE.DA

【讨论】:

    【解决方案2】:

    来自man sort

       ***  WARNING  ***  The locale specified by the environment affects sort order.  Set `LC_ALL=C` to get the traditional sort order that uses native byte values.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-25
      • 2013-09-20
      • 2013-01-26
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      相关资源
      最近更新 更多