我需要根据第一列中的名称对文件进行排序。有些名字以问号结尾。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