2010-07-18 24 views
2

我有一个示例文件在每个单独的包含“aA0_-”字符。使用GNU排序它提供了以下排序顺序:不一致的排序行为

$ cat /tmp/sample | sort 

_ 
- 
0 
a 
A 

追加一些其他的字符后,我们得到了一个不同的顺序(非字母数字字符似乎有较低的优先级):

$ cat /tmp/sample | sed 's/$/x/' | sort 
0x 
ax 
Ax 
x 
_x 
-x 

而当我们将这个字符插入到开头,我们获得原始排序顺序:

$ cat /tmp/sample | sed 's/^/x/' | sort 
x 
x_ 
x- 
x0 
xa 
xA 

..这种行为的解释是什么?

UPDATE

'z' 时和 'Z' 字符被纳入样本,结果似乎还不必遗憾,毕竟

$ cat /tmp/sample | sed 's/$/x/' | sort 
0x 
ax 
Ax 
x 
_x 
-x 
zx 
Zx 

..但对正确答案的光,这是因为所有'','_'和'-'都是当前语言环境(en_US.UTF-8)中的空格,并且在排序时不会被忽略。

+0

你的语言环境是什么? – 2010-07-18 00:07:32

+0

@ [Sanjay Manohar]区域设置为en_US.UTF-8。嗯,很好的提示;) – mykhal 2010-07-18 00:09:25

回答

4

您的区域设置文件应该包含LC_COLLATE的定义。 这决定了字符的排序顺序。 同时检查LC_CTYPE的定义,以及哪些字符被分类为“空间”。

如果将' - '和'_'分类为空格,则可能会找到显示的结果。