Linux 排序的默认顺序是什么?

26 linux sort locale

很长一段时间,我认为程序的默认行为sort是使用 ASCII 顺序。但是,当我在sort不带任何参数的情况下输入以下行时:

#
@
Run Code Online (Sandbox Code Playgroud)

我有:

@
#
Run Code Online (Sandbox Code Playgroud)

但是根据ASCII表,#是35,@是64。 另一个例子是:

A
a
Run Code Online (Sandbox Code Playgroud)

输出是:

a
A
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?顺便说一下,使用时什么是“字典顺序” sort -d

小智 24

看起来您使用的是非 POSIX 语言环境。

尝试:

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

然后sort

info sort 明确地说:

(1) 如果您使用非 POSIX 语言环境(例如,通过将 `LC_ALL' 设置为 `en_US'),那么 `sort' 可能会产生与您习惯的排序不同的输出。在这种情况下,将“LC_ALL”环境变量设置为“C”。请注意,仅设置“LC_COLLATE”有两个问题。首先,如果还设置了“LC_ALL”,则无效。其次,如果`LC_CTYPE'(或`LANG',如果`LC_CTYPE' 未设置)设置为不兼容的值,则它具有未定义的行为。例如,如果`LC_CTYPE' 是`ja_JP.PCK' 而`LC_COLLATE' 是`en_US.UTF-8',你会得到未定义的行为。

  • OP 询问排序顺序是什么,而不是如何更改它。 (5认同)

G-M*_*ca' 5

如上所述man sort,\xe2\x80\x9c字典顺序\xe2\x80\x9d表示\n\xe2\x80\x9c仅考虑空格和字母数字字符\xe2\x80\x9d。\xc2\xa0\n例如,给定数据

\n\n
The\n!quick\nbrown\n@fox\njumps\n#over\n17\n$lazy\n  dogs\n%42\ntimes.\n
Run Code Online (Sandbox Code Playgroud)\n\n

朴素的sort命令产生

\n\n
  dogs\n!quick\n#over\n$lazy\n%42\n@fox\n17\nbrown\njumps\nThe\ntimes.\n
Run Code Online (Sandbox Code Playgroud)\n\n

(将以空格字符开头的行以及!#$%@符号1 \n 放在以字母和数字开头的行的前面;\ni.e,字母数字字符),但sort -d会产生

\n\n
  dogs\n17\n%42\nbrown\n@fox\njumps\n$lazy\n#over\n!quick\nThe\ntimes.\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xc2\xa0 dogs仍然是第一个,因为它以空格开头,\n但特殊(标点符号)字符被忽略。\xc2\xa0\n17出现在 之前42,并且fox位于brown和之间jumps,\尽管事实上42fox前面有字符\ nthat 通常会将它们移到17.
\n____________
\n 1按其 ASCII 值的顺序:\nspace=040、!=041、#=043、$=044、%=045 和@=0100。\xe2\x80\x82\n请注意(忽略空格键)\n这个在某些键盘上大约是从左到右的顺序。

\n