macOS sort命令--debug模式下s1、s2含义解析及排序异常问题
排序异常分析与debug输出解读
1. 排序异常的原因与修复
你的问题出在sort -b -k 3的字段定位逻辑上:
- 对于有标签的行(如
sha:12345 ['tag1','tag2'] 2022-01-24),日期确实是第3个字段,-k3能正确取到日期作为排序键。 - 对于无标签的行(如
sha:12344 2022-02-10),连续空格被视为单个分隔符,所以该行只有2个字段:第1个是sha值,第2个是日期。此时-k3指定的第3字段不存在,sort会将空字符串作为该行的排序键。
在字典序排序中,空字符串小于任何非空字符串,因此所有无标签行都会排在有标签行前面;当多个行的排序键都是空时,sort会回退到默认的整行排序,所以无标签行按sha值的字典序排列(sha:12344 < sha:12346)。
修复命令
要实现按日期(最后一个字段)统一排序,不管第二字段是否空缺,直接按倒数第一个字段排序即可:
sort -b -k -1 acr_list
该命令会自动识别每行的最后一个字段(即日期)作为排序键,所有行都会按日期正常排序。
2. sort --debug 输出字段详解
你提供的debug输出各部分含义如下:
Using collate rules of en_GB.UTF-8 locale sort_method=mergesort ; k1=<2022-09-16>(10), k2=<2022-04-28>(10); s1=<sha256:12344 ['tag1'] 2022-09-16>, s2=<sha256:12345 ['tag2'] 2022-04-28>; cmp1=5 ; k1=<2022-09-16>(10), k2=<>(0); s1=<sha256:12346 ['tag3'] 2022-09-16>, s2=<sha256:12347 2022-04-14>; cmp1=1
Using collate rules of en_GB.UTF-8 locale:当前采用英式英语UTF-8字符集的排序规则,决定了字符的字典序优先级。sort_method=mergesort:sort使用的排序算法为归并排序。- 每一条分号开头的记录是一次键比较过程:
k1=<内容>(长度):参与比较的第一行(s1)的排序键内容,括号内是键的字符长度。比如第一条记录中k1是s1的第3字段2022-09-16,长度为10。k2=<内容>(长度):参与比较的第二行(s2)的排序键内容,括号内是键的字符长度。第二条记录中k2为空字符串(<>),长度0,说明s2没有第3字段。s1=<内容>:参与比较的第一行的完整内容。s2=<内容>:参与比较的第二行的完整内容。cmp1=数值:排序键的比较结果:- 数值>0:k1大于k2,s2应该排在s1前面。
- 数值=0:k1等于k2,若有多个排序键则继续比较下一个键,否则回退到整行比较。
- 数值<0:k1小于k2,s1应该排在s2前面。
内容的提问来源于stack exchange,提问作者Swaps
相关产品推荐
相关产品推荐

