【问题标题】:What is alphabetical ordering for sort utility?什么是排序实用程序的字母顺序?
【发布时间】:2016-03-30 08:44:32
【问题描述】:

我称自己为 POSIX shell 向导。但今天我把屎塞进裤子里了。

所以这没什么奇怪的:

bash# printf 'v10\nv1.' | sort
v1.
v10

因为. 的代码为0x2e,而0 的代码为0x30。但是这个怎么样:

bash# printf 'v101\nv1.1' | sort
v101
v1.1

WTF?好的,我是巫师:

$ locale

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_DK.utf8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

所以:

bash# printf 'v101\nv1.1' | LC_ALL=C sort
v1.1
v101

语言环境/排序规则如何生成"v101" < "v1.1"

我认为en_US.UTF-8 语言环境有整理规则来去除. 符号。这个测试表明我有观点:

bash# printf 'v102\nv1.01' | LC_ALL=en_US.UTF-8 sort
v1.01
v102

bash# printf 'v102\nv1.03' | LC_ALL=en_US.UTF-8 sort
v102
v1.03

我说的对吗?如果我是对的,谁不喜欢圆点? UTF-8 还是说英语的人还是美国人?

这是 POSIX 兼容的行为吗?

【问题讨论】:

标签: bash sorting posix locale collation


【解决方案1】:

是的,当 LOCALE 不是 C 时,点似乎被忽略了。破折号也以同样的方式被忽略。并且 sort 服从语言环境。每天学习新东西。

matt@xen:~/dev/OTOY2$ printf "aa\nab\nac\n" | LC_COLLATE=C sort
aa
ab
ac
matth@xen:~/dev/OTOY2$ printf "aa\n.ab\nac\n" | LC_COLLATE=C sort
.ab
aa
ac

matt@xen:~/dev/OTOY2$ printf "aa\nab\nac\n" | sort
aa
ab
ac
matth@xen:~/dev/OTOY2$ printf "aa\n.ab\nac\n" | sort
aa
.ab
ac

您可能有兴趣知道 sort 也可以进行自然或数字排序。 所以 100 10 和 20 可以在排序上使用 -g 或 -h 正确排序。

在 Linux 下还有一个 --debug 标志。

matthewh@xen:~/dev/OTOY2$ printf 'v101\nv1.1' | sort --debug
sort: using ‘en_NZ.UTF-8’ sorting rules
v101
____
v1.1
____

我认为整个答案都包含在这个庞大的规范中: http://www.unicode.org/reports/tr10/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2013-08-30
    • 2011-01-30
    • 2019-04-05
    • 2012-04-08
    • 2022-01-06
    相关资源
    最近更新 更多