首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排序-k1,2是否等同于排序-k1,1 -k2,2?

排序-k1,2是否等同于排序-k1,1 -k2,2?
EN

Unix & Linux用户
提问于 2018-07-19 16:11:55
回答 1查看 1.1K关注 0票数 2

我正在试验GNU排序和LC_COLLATE="en_US.UTF-8“。我有一个名为‘test’的文件:

代码语言:javascript
复制
1,0 1
10 2
1,0 3
10 4

对于sort -k1,2和简单的sort test,顺序不会改变:

代码语言:javascript
复制
$ sort -k1,2 test
1,0 1
10 2
1,0 3
10 4

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

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

代码语言:javascript
复制
$ 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,它们都有这种行为)

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 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设置为仅基于字符值获得排序规则,而不使用权重。你的例子都会导致

代码语言:javascript
复制
1,0 1
1,0 3
10 2
10 4

当使用“C”区域设置时。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/457259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档