`sort` 忽略问号

`sort` 忽略问号

我需要根据第一列中的名称对文件进行排序。有些名字以问号结尾。sort在排序过程中始终忽略这个问号:

sort -k 1 -t , <<TEST
a?,1
a,2
b?,2
b,1
TEST
a?,1
a,2
b,1
b?,2

我真的不在乎如何sort排列问号,如果它只是这样做的话始终如一地。但事实并非如此,似乎改为考虑第二列,甚至如果我sort明确告知仅使用第一列作为键。

版本信息:

$ sort --version
sort (GNU coreutils) 8.22
Packaged by Gentoo (8.22 (p1.0))

顺便说一句,在 OS X 10.9(将sort自己标识为“sort (GNU coreutils) 5.93”)上,上述内容对我来说按预期工作。

答案1

使用LC_ALL=C似乎在排序 8.21 上为我提供了正确的结果。

$ LC_ALL=C sort -k1,1 -t , sample.txt     
a,2
a?,1
b,1
b?,2

或者正如你所写的:

$ cat | LC_ALL=C sort -k1,1 -t , <<TEST
a?,1
a,2
b?,2
b,1
TEST
a,2
a?,1
b,1
b?,2

顺便说一句,你不需要cat

$ LC_ALL=C sort -k1,1 -t , <<TEST
a?,1
a,2
b?,2
b,1
TEST
a,2
a?,1
b,1
b?,2

LC_COLLATE=C对我也有用。

sort -k1关于vs的使用sort -k1,1

上面的示例都使用命令的修改版本sort来使用,-k1,1而不是仅仅-k 1因为这会导致其他特殊字符(例如%.

只用-k1:

$ printf '%s\n' a a%,foo a,bar | LC_ALL=C sort -t, -k1    
a
a%,foo
a,bar

-k1,1:

$ printf '%s\n' a a%,foo a,bar | LC_ALL=C sort -t, -k1,1
a
a,bar
a%,foo

相关内容