使用sort -k排序含1:X格式字段不符合预期,如何解决?
解决
sort -k3对X:Y格式字段排序不符合人类习惯的问题 问题场景
你有如下数据列表:
DI bpg01001:PGE00 3:1 ------ 1 1 (No fault) DI bpg01001:VOL00 2:13 ------ 1 1 (Normal) DI dca06001:HPR00 3:12 ------ 1 1 (Normal) DI dca06001:HUH00 3:15 ------ 1 1 (Normal) DI dca06001:PWS00 3:14 ------ 1 1 (Normal) DI dca06001:UOL00 3:13 ------ 1 1 (Normal) DI rcf10001:ACO00 2:0 ------ 1 1 (Present) DI rcf10001:BDC00 2:4 ------ 1 1 (Normal) DI rcf10001:ERR00 2:2 ------ 1 1 (Normal) DI rcf10001:ERS00 2:3 ------ 1 1 (Normal) DO bpg01001:PGS00 1:4 ------ 0 0 (Stop)
直接使用sort -k3会按字典序排序,导致结果不符合人类阅读习惯(比如2:13会排在2:2前面,因为字典序中1比2小)。
解决办法
方法1:使用版本排序选项-V
sort的-V选项会按「版本号风格」排序,自动识别X:Y格式中的数值部分,按冒号前后的数值依次升序排列:
sort -k3V your_file.txt
执行后会得到符合预期的排序结果:
DO bpg01001:PGS00 1:4 ------ 0 0 (Stop) DI rcf10001:ACO00 2:0 ------ 1 1 (Present) DI rcf10001:ERR00 2:2 ------ 1 1 (Normal) DI rcf10001:ERS00 2:3 ------ 1 1 (Normal) DI rcf10001:BDC00 2:4 ------ 1 1 (Normal) DI bpg01001:VOL00 2:13 ------ 1 1 (Normal) DI bpg01001:PGE00 3:1 ------ 1 1 (No fault) DI dca06001:HPR00 3:12 ------ 1 1 (Normal) DI dca06001:UOL00 3:13 ------ 1 1 (Normal) DI dca06001:PWS00 3:14 ------ 1 1 (Normal) DI dca06001:HUH00 3:15 ------ 1 1 (Normal)
方法2:手动指定多字段数值排序
如果你的sort版本不支持-V选项,可以手动拆分X:Y字段,分别按冒号前后的数值排序:
sort -k3.1,3.1n -k3.3,3.3n your_file.txt
-k3.1,3.1n:对第3个字段的第1个字符(冒号前的数字)按数值升序排序-k3.3,3.3n:对第3个字段从第3个字符开始的部分(冒号后的数字)按数值升序排序
总结
-V选项简洁易用,适合处理类似X:Y、版本号这类结构化的数值字符串- 手动字段拆分兼容性更好,适合自定义排序逻辑的场景
内容的提问来源于stack exchange,提问作者Pavlos
相关产品推荐
相关产品推荐

