如何补全hh:mm:s的秒数前导0以实现sort -k2正确排序?
解决秒数无前导0导致的时间排序问题
你推测的原因完全正确:sort -k2默认按字典序比较字符串,秒段为"18"的字符串会比"3"靠前(因为首字符"1"的ASCII值小于"3"),导致排序结果不符合时间顺序。下面提供两种可行的解决方案:
方法一:补全秒数前导0后排序
用awk拆分时间字段,将秒数格式化为两位数字(自动补0),再重新组合输出后排序:
awk '{split($2, time_parts, ":"); time_parts[3] = sprintf("%02d", time_parts[3]); $2 = time_parts[1]":"time_parts[2]":"time_parts[3]; print}' input.txt | sort -k2
处理后原始输入会被转换为标准的两位秒数格式,再排序就能得到符合时间顺序的结果:
peer0 23:51:03 peer2 23:51:15 peer1 23:51:18
方法二:直接用sort自定义规则排序(无需修改数据)
利用sort的字段位置定位,指定按时间的时、分、秒分段进行数值排序,无需修改原始数据:
sort -k2.1,2.2n -k2.4,2.5n -k2.7,2.8n input.txt
参数说明:
-k2.1,2.2n:按第二列的第1-2个字符(小时部分)以数值方式排序-k2.4,2.5n:按第二列的第4-5个字符(分钟部分)以数值方式排序-k2.7,2.8n:按第二列的第7-8个字符(秒数部分)以数值方式排序
这种方式会直接按时间的数值大小比较,不管秒数是否有前导0,都能输出正确的排序结果。
内容的提问来源于stack exchange,提问作者Vaggelis
相关产品推荐
相关产品推荐

