当我使用不同的字段分隔符时,为什么coreutils sort会给出不同的结果?

时间:2015-12-08 13:57:40

标签: sorting command-line gnu-coreutils

在命令行中使用sort时,为什么排序顺序取决于我使用的字段分隔符?例如,

$ # The test file:
$ cat test.csv
2,az,a,2
3,a,az,3
1,az,az,1
4,a,a,4

$ # sort based on fields 2 and 3, comma separated.  Gives correct order.  
$ LC_ALL=C sort -t, -k2,3 test.csv 
4,a,a,4
3,a,az,3
2,az,a,2
1,az,az,1

$ # replace , by ~ as field separator, then sort as before.  Gives incorrect order.
$ tr "," "~" < test.csv | LC_ALL=C sort -t"~" -k2,3
2~az~a~2
1~az~az~1
4~a~a~4
3~a~az~3

第二种情况不仅导致排序错误,而且在字段2(az&lt; a)和字段3(其中a&lt; {{1}之间不一致})。

1 个答案:

答案 0 :(得分:1)

-k2,3出错。这意味着sort应该从第2个字段开始并在第3个字段结束。这意味着它们之间的分隔符也是要排序的部分,因此计为字符。这就是为什么你会遇到不同分类符的不同种类。

您想要的是以下内容:

LC_ALL=C sort -t"," -k2,2 -k3,3 file

tr "," "~" < file | LC_ALL=C sort -t"~" -k2,2 -k3,3

这意味着sort应对第二个字段进行排序,并且第二个字段对第三个字段进行排序。