我正在试验GNU排序和LC_COLLATE="en_US.UTF-8“。我有一个名为‘test’的文件:
1,0 1
10 2
1,0 3
10 4对于sort -k1,2和简单的sort test,顺序不会改变:
$ sort -k1,2 test
1,0 1
10 2
1,0 3
10 4因此,排序认为'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?这是否真的等同呢?还是我曲解了手册页?(我尝试了8.22和8.29版本的coreutils,它们都有这种行为)
发布于 2018-07-19 16:27:42
-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”区域设置时。
https://unix.stackexchange.com/questions/457259
复制相似问题