Linux sort命令多列排序问题:如何实现指定字段数值排序
自定义规则排序文本数据
问题描述
原始数据如下:
foo-a12a11 foo-a12a2 foo-a12b12 foo-a12b21 foo-a13a10 foo-a13a1 foo-a13a9 IIII122344 # 表示我希望考虑字段的顺序(I=忽略)
需要按以下规则排序:
- 先按
foo-a后的两位数字排序(如12、13,按数值顺序) - 再按数字后的单个字母排序(如a、b,按字典序)
- 最后按末尾的数字排序(按数值顺序,如2排在11前,9排在10前)
注:所有数据的foo-a部分完全相同,排序时可忽略。
尝试使用命令 sort --key=1.1db,2.8n 时,报错 sort: options '-dn' are incompatible;改用字典序排序末尾数字时,会出现10排在9前的字典序问题,不符合需求。
期望的排序结果:
foo-a12a2 foo-a12a11 foo-a12b12 foo-a12b21 foo-a13a1 foo-a13a9 foo-a13a10
解决方法
问题出在你将d(字典序)和n(数值序)作为全局参数同时指定,这两个参数无法全局共存,必须为每个排序键单独配置对应的排序规则。
针对需求,正确的sort命令如下:
sort -k6,7n -k8,8d -k9,n input.txt
参数说明
-k6,7n:对第6到7位的字符执行数值排序,对应数据中的12/13部分,确保数字按数值大小排列。-k8,8d:对第8位的字符执行字典序排序,对应数据中的a/b部分,确保字母按字典顺序排列。-k9,n:从第9位开始到行尾的内容执行数值排序,解决末尾数字的字典序问题,让10排在9之后。
执行该命令后,即可得到你期望的排序结果。
内容的提问来源于stack exchange,提问作者user9793038
相关产品推荐
相关产品推荐

