You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash按HH:MM:SS与AM/PM两列实现文件内容排序

按AM/PM优先级及时间顺序排序文本行

问题描述

需要对包含时间(HH:MM:SS)和AM/PM标识的文本行进行排序:

  1. 所有AM行排在PM行之前
  2. 同一时段(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-

步骤说明

  1. awk转换处理:
    • 拆分时间字段为小时、分钟、秒
    • 转换为24小时制:AM的12点转为00,PM的非12点加12
    • 在每行前添加24小时制的数字排序键(如093841对应09:38:41 AM)
  2. 排序:sort -k1,1按新增的数字键排序,保证时间顺序正确
  3. 还原输出:cut -d' ' -f2-去掉新增的排序键,输出原内容

运行该命令后,输出将与期望结果完全一致。

内容的提问来源于stack exchange,提问作者Lastwish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:40:39