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


18

长期以来,我认为程序的默认行为sort是使用ASCII顺序。但是,当我输入以下行时sort不带任何参数:

#
@

我有:

@
#

但是根据ASCII表,分别#是35和@64。另一个示例是:

A
a

输出为:

a
A

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


5
排序顺序取决于您的语言环境设置
janneb 2012年

2
但是默认情况下至少在GNU排序中它是字母顺序。
jarno

Answers:


17

看起来您正在使用非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”,则会得到未定义的行为。


3
OP正在询问排序顺序,而不是如何更改排序顺序。

1
谢谢,我已经在计算机上进行了测试,语言环境设置确实会影响排序行为

3

要确定排序顺序,只需在每行上创建一个具有不同字符的文件,然后对其进行排序。结果输出将告诉您排序顺序。



1
通常这是一个很好的主意,但并不总是足够的。排序规则不必仅在单个字符上定义。某些归类将“ ae”视为一个连字,或将​​它们视为已分解。另一种情况是,许多归类将'a'和'A'视为相等,但是通过测试看到的顺序并不能告诉您(它可以告诉您排序是否稳定)。而且,单字符测试无法确定制表符扩展,空格标准化等是否有效。但是,这是一个很好的起点。
TextGeek

1
(为时已晚,无法编辑先前的注释)-只要您实际上包含足够多的字符范围,就可以通过看到(例如)aAbB而不是abAB来区分大小写。
TextGeek

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和之间。 ____________ 以其ASCII值的顺序为1:space = 040,= 041,= 043,= 044,= 045和= 0100。请注意(忽略空格键),这在某些键盘上大约是从左到右的顺序。jumps42fox17

!#$%@


1
如果有效的语言环境为C(与LC_ALL = C一样),而不是其他语言环境,则可能会导致第一个示例中的顺序在标点符号上首先排序。默认的语言环境取决于操作系统设置。因此,未经修饰的 sort许多分布应该有所不同。
艾萨克(Isaac)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.