Bash按HH:MM:SS与AM/PM两列实现文件内容排序
按AM/PM优先级及时间顺序排序文本行
问题描述
需要对包含时间(HH:MM:SS)和AM/PM标识的文本行进行排序:
- 所有AM行排在PM行之前
- 同一时段(AM/PM)内按时间先后顺序排列
输入示例
11:36:48 AM col3 ... 11:32:00 AM col3 ... 03:18:54 PM col3 ... 02:26:40 PM col3 ... 01:51:56 PM col3 ... 12:55:58 PM col3 ... 11:58:48 AM col3 ... 09:38:41 AM col3 ...
期望输出
09:38:41 AM col3 ... 11:32:00 AM col3 ... 11:36:48 AM col3 ... 11:58:48 AM col3 ... 12:55:58 PM col3 ... 01:51:56 PM col3 ... 02:26:40 PM col3 ... 03:18:54 PM col3 ...
解决方案
推荐使用awk转换为24小时制后排序,能完美匹配12小时制的时间逻辑:
awk '{ split($1, t, ":"); h = t[1]; m = t[2]; s = t[3]; if ($2 == "AM") { if (h == 12) h = 0; } else { if (h != 12) h += 12; } printf "%02d%02d%02d %s\n", h, m, s, $0; }' input.txt | sort -k1,1 | cut -d' ' -f2-
步骤说明
awk转换处理:- 拆分时间字段为小时、分钟、秒
- 转换为24小时制:AM的12点转为00,PM的非12点加12
- 在每行前添加24小时制的数字排序键(如
093841对应09:38:41 AM)
- 排序:
sort -k1,1按新增的数字键排序,保证时间顺序正确 - 还原输出:
cut -d' ' -f2-去掉新增的排序键,输出原内容
运行该命令后,输出将与期望结果完全一致。
内容的提问来源于stack exchange,提问作者Lastwish
相关产品推荐
相关产品推荐

