sort -k1,2 是否等于 sort -k1,1 -k2,2?

sort -k1,2 是否等于 sort -k1,1 -k2,2?

我正在尝试 GNU 排序和 LC_COLLATE="en_US.UTF-8"。我有一个名为“测试”的文件:

1,0 1
10 2
1,0 3
10 4

Withsort -k1,2和 simple 的sort test顺序不会改变:

$ sort -k1,2 test
1,0 1
10 2
1,0 3
10 4

因此, sort 认为 '1,0' 等于 '10' 可能是由于 LC_COLLATE 的一些怪癖(跳过标点符号?)

现在,当我使用 时sort -k1,1 -k2,2,它给了我一个不同的顺序:

$ sort -k1,1 -k2,2 test
10 2
10 4
1,0 1
1,0 3

突然排序不再认为“10”与“1,0”相同。

发生了什么?为什么在这种情况下不sort -k1,1 -k2,2等于?sort -k1,2真的应该等价吗?或者我误解了手册页? (我尝试了 coreutils 8.22 和 8.29 版本,都有这种行为)

答案1

-k1,2意思是“对所有行进行排序,同时比较所有字段的内容从1到2”;所以“1,0 1”与“10 2”等进行比较。

-k1,1 -k2,2意思是“对所有行进行排序,比较字段1的内容,当两行字段1的内容相同时,比较字段2的内容”;因此“1,0”与“10”进行比较,然后“2”与“4”进行比较,依此类推。

在这两种情况下,接下来发生的事情都归结为校对,特别是加权。数字通常比标点符号和空格具有更高的权重。比较“1,0 1”和“10 2”时,由于数字不同,因此忽略由逗号引起的差异。当比较“1,0”和“10”时,唯一的区别是逗号,因此不再被忽略。看ISO 14651了解详情。

您可以设置LC_COLLATE=C仅根据字符值进行排序,没有权重。你的例子都会导致

1,0 1
1,0 3
10 2
10 4

当使用“C”语言环境时。

相关内容