UNIX排序忽略空格

dag*_*ies 17 linux sorting shell locale

给定一个文件txt:

ab
a c
a a
Run Code Online (Sandbox Code Playgroud)

打电话时sort txt,我获得:

a a
ab
a c
Run Code Online (Sandbox Code Playgroud)

换句话说,它不是正确的排序,它有点删除/忽略空白!我希望这是行为,sort -i但无论是否有-i旗帜都会发生.

我想获得"正确"的排序:

a a
a c
ab
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

dag*_*ies 18

解决方法:

export LC_ALL=C
Run Code Online (Sandbox Code Playgroud)

sort()文档:

警告:环境指定的区域设置会影响排序顺序.设置LC_ALL = C以获取使用本机字节值的传统排序顺序.

(至少适用于ASCII,不知道UTF8)

  • @Aditya:...是的...对...到底什么是“语言环境”?:p 为什么会影响排序?为什么*默认*不使用默认排序?(我的 LC_ALL 为空)在这种情况下使用哪种排序?...抱歉,如果这一切对我来说似乎并不明显。 (2认同)
  • ...是的...我刚刚注意到 `LC_ALL=C` 破坏了我的 UTF8 字符显示...所以我无法正确对它们进行排序或无法正确显示它们。耶! (2认同)
  • 您不必导出 LC_ALL,只需在单个命令中内嵌运行它 - 就像 `LC_ALL=C sort ...` 一样。 (2认同)
  • *“‘区域设置’到底是什么?为什么它会影响排序?为什么*默认情况下*不使用默认排序?”* -- 不存在一种正确的排序顺序。不同的人对于如何排序有不同的想法。其中一些取决于“区域设置”,例如美国或德国。因此,计算机“区域设置”是一种影响排序顺序、大写/小写转换、数字格式等的环境设置,以便这些函数执行区域设置认为“默认”的任何操作。LC_ALL=C为最小公分母;你实际上是在告诉计算机“装傻”。 (2认同)

thi*_*ton 11

就像前面提到的LC_ALL=C sort那样,诀窍.这仅仅是因为不同的语言对字符排序有不同的规则,这些规则通常由高级语言学家而不是CS专家来规划.对于您的语言环境,这些规则似乎表明在排序时应该忽略空格.

通过为LC_ALL = C添加前缀(或者,当LC_ALL未设置时,LC_COLLATE=C足够),您可以明确地声明与语言无关的排序(以及使用LC_ALL,数字格式和填充),这是您在此上下文中所需的.如果要将其设为默认值,请在您的环境中导出LC_COLLATE.

以这种方式选择默认值以保持与"正常",真实世界的排序方案(如白页)的一致性,这通常忽略空格.