将WhatsApp聊天日志的12小时制时间转换为24小时制
WhatsApp聊天日志12小时制转24小时制解决方案
问题背景
我有大量空格分隔的WhatsApp聊天日志,其中95%的日志行遵循格式 MM/DD/YY, HH:MM XM - participant: chatText,需要将其中的12小时制时间戳转换为24小时制,同时保留非标准格式的行不修改。要求支持读取日志文件、原地修改或输出到新文件,且尽量无需额外安装开发环境。
原日志示例
5/30/22, 9:50 AM - person2: Good morning 5/30/22, 11:35 AM - person1: Hi, how are you? 5/30/22, 11:47 AM - person2: I am well Transfer number: 3778324 Completed: 5/30/22, 12:55 PM - person1: https://mylink.com 5/30/22, 12:59 PM - person2: <Media omitted> 5/30/22, 9:46 PM - person1: thanks
期望转换结果
5/30/22, 09:50 - person2: Good morning 5/30/22, 11:35 - person1: Hi, how are you? 5/30/22, 11:47 - person2: I am well Transfer number: 3778324 Completed: 5/30/22, 12:55 - person1: https://mylink.com 5/30/22, 12:59 - person2: <Media omitted> 5/30/22, 21:46 - person1: thanks
之前尝试的awk命令无法完整转换小时,也不会跳过非标准行,以下是修正后的方案:
修正后的awk命令
核心逻辑是先精准匹配标准格式的日志行,再对时间字段做转换,非匹配行直接输出。
awk ' BEGIN { OFS = " " } # 匹配标准格式行:开头为日期,接着是HH:MM AM/PM,然后是"-" /^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{2}, [0-9]{1,2}:[0-9]{2} (AM|PM) -/ { # 拼接时间字符串,调用date命令转换为24小时制 cmd = "date --date=\"" $2 " " $3 "\" +%H:%M" cmd | getline new_time close(cmd) # 关闭管道避免资源泄漏 # 替换原时间字段,移除AM/PM字段 $2 = new_time $3 = "" # 输出处理后的行 print $0 next } # 非标准格式行直接输出 { print } ' input.txt > output.txt
关键改进说明
- 精准匹配标准行:用正则表达式锁定符合格式的日志,避免误修改其他行。
- 正确时间转换:通过
date命令自动处理12小时转24小时的逻辑,比如9:46 PM转为21:46,9:50 AM转为09:50。 - 清理冗余字段:转换后移除原有的AM/PM字段,避免输出多余空格。
- 避免资源泄漏:每次调用
getline后关闭管道,防止awk打开过多文件描述符。
原地修改文件
如果需要直接修改原文件,有两种方式:
- 使用
sponge(多数Linux发行版默认包含在moreutils包中):
awk '...' input.txt | sponge input.txt
- 无
sponge时,用临时文件中转:
awk '...' input.txt > temp.txt && mv temp.txt input.txt
验证效果
运行命令后,标准格式行的时间会正确转换,非标准行(如Transfer number: 3778324)保持原样,完全符合预期结果。
内容的提问来源于stack exchange,提问作者dotarpa
相关产品推荐
相关产品推荐

