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

Sorting 当我使用不同的字段分隔符时,为什么coreutils sort会给出不同的结果?,sorting,command-line,gnu-coreutils,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,

在命令行上使用
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
$#测试文件:
$cat test.csv
2,az,a,2
3,a,az,3
1,az,az,1
四,一,一,四
$#根据字段2和3进行排序,逗号分隔。给出正确的顺序。
$LC_ALL=C排序-t,-k2,3 test.csv
四,一,一,四
3,a,az,3
2,az,a,2
1,az,az,1
$#替换为~作为字段分隔符,然后按以前的方式进行排序。给出了错误的顺序。
$tr“,“~”

第二种情况不仅排序错误,而且字段2(其中
az
a
)和字段3(其中
a
az
)之间不一致。

-k2,3
中存在错误。这意味着
sort
应该从第2个字段开始排序,并在第3个字段结束。这意味着它们之间的分隔符也是要排序的内容的一部分,因此被视为字符。这就是为什么会遇到使用不同分隔符的不同排序

您需要的是以下内容:

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

tr”、“~”

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

谢谢@chaos,我没有意识到-k可以多次使用。现在它对我有效了。请注意--debug选项,它将突出显示比较的范围
tr "," "~" < file | LC_ALL=C sort -t"~" -k2,2 -k3,3