当我使用不同的字段定界符时,为什么 coreutils sort 会给出不同的结果?
Why does coreutils sort give a different result when I use a different field delimiter?
在命令行中使用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
< a
)和字段 3(其中 a
< az
).
-k2,3
中有一个错误。这意味着 sort
应该从第二个字段开始排序到第三个字段结束。这意味着它们之间的分隔符也是要排序的内容的一部分,因此算作字符。这就是为什么您会遇到使用不同分隔符的不同类型的原因。
你想要的是:
LC_ALL=C sort -t"," -k2,2 -k3,3 file
并且:
tr "," "~" < file | LC_ALL=C sort -t"~" -k2,2 -k3,3
这意味着 sort
应该对第二个字段进行排序,并且第二个字段重复对第三个字段进行排序。
在命令行中使用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
< a
)和字段 3(其中 a
< az
).
-k2,3
中有一个错误。这意味着 sort
应该从第二个字段开始排序到第三个字段结束。这意味着它们之间的分隔符也是要排序的内容的一部分,因此算作字符。这就是为什么您会遇到使用不同分隔符的不同类型的原因。
你想要的是:
LC_ALL=C sort -t"," -k2,2 -k3,3 file
并且:
tr "," "~" < file | LC_ALL=C sort -t"~" -k2,2 -k3,3
这意味着 sort
应该对第二个字段进行排序,并且第二个字段重复对第三个字段进行排序。