bash中sort命令按.分隔多列排序仅第一列生效问题排查
问题背景
- 待排序的日期文本内容如下:
2023.12.14 2020.10.4 2020.10.1 2020.5.18 2023.14.1 2021.1.1
- 期望升序排序结果如下:
2020.5.18 2020.10.1 2020.10.4 2021.1.1 2023.12.14 2023.14.1
- 最初尝试使用的命令:
sort -t "." -k1,1 -k2,1 -k3,1 sortingTest.txt - 执行异常:命令仅按第一列(年份段)完成排序,第二列、第三列的排序逻辑未生效,不符合预期。
错误原因
命令存在两处配置问题:
-k排序键的范围写法错误sort的-k参数格式为-k 起始位置,结束位置,用于指定排序键覆盖的字段范围。你写的-k2,1、-k3,1中,结束字段序号小于起始字段序号,属于无效配置,sort会直接忽略这两个排序键,最终只生效第一个有效排序键-k1,1,也就是仅按第一列排序。- 缺少数值排序配置
即使修正了排序键范围,sort默认按字符串字典序排序,会出现10排在5前面的情况(逐字符比较时,字符1的ASCII码小于5),不符合日期数值大小的排序逻辑。
修正方案
使用以下命令即可得到预期结果:
sort -t "." -k1,1n -k2,2n -k3,3n sortingTest.txt
参数说明:
-t ".":指定.为字段分隔符-k1,1n:第一个排序键为第1字段到第1字段,按数值(n参数)升序排序-k2,2n:第二个排序键为第2字段到第2字段,按数值升序排序,仅在第一字段值相等时生效-k3,3n:第三个排序键为第3字段到第3字段,按数值升序排序,仅在第一、第二字段值都相等时生效
内容的提问来源于stack exchange,提问作者Julian Re
相关产品推荐
相关产品推荐

