很长一段时间我认为程序的默认行为sort
是使用 ASCII 顺序。但是,当我在不带任何参数的情况下输入以下行时sort
:
#
@
我有:
@
#
但根据 ASCII 表,#
是 35,@
是 64。 再比如:
A
a
输出是:
a
A
有人能解释一下吗?顺便问一下,使用时“字典顺序”是什么sort -d
?
答案1
看起来您正在使用非 POSIX 语言环境。
尝试:
export LC_ALL=C
进而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”,则会出现未定义的行为。
答案2
正如man sort
所说,“字典顺序”意味着“仅考虑空格和字母数字字符”。例如,给定数据
The
!quick
brown
@fox
jumps
#over
17
$lazy
dogs
%42
times.
朴素的sort
命令产生
dogs
!quick
#over
$lazy
%42
@fox
17
brown
jumps
The
times.
(将以空格字符和!
、#
、$
、%
和@
符号1开头的行 放在以字母和数字开头的行之前;即,字母数字字符),但sort -d
产生
dogs
17
%42
brown
@fox
jumps
$lazy
#over
!quick
The
times.
dogs
仍然是第一个,因为它以空格开头,但特殊(标点符号)字符将被忽略。
17
位于42
和fox
之间brown
,jumps
尽管42
和fox
前面有通常会将它们移动到 之前的字符17
。
____________
1按其 ASCII 值的顺序:空格=040、!
=041、#
=043、$
=044、%
=045 和@
=0100。请注意(忽略空格键)在某些键盘上这大约是从左到右的顺序。
答案3
要确定排序顺序,只需创建一个文件,每行使用不同的字符,然后对其进行排序。结果输出将告诉您排序顺序。