Sort

sort 忽略問號

  • May 16, 2014

我需要根據第一列中的名稱對文件進行排序。有些名字以問號結尾。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”)上,上述工作對我來說是預期的。

在排序 8.21 上,使用LC_ALL=C似乎為我提供了正確的結果。

$ 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 -k1vs。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

引用自:https://unix.stackexchange.com/questions/130630