我正在尝试 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”语言环境时。