如何将文件中旧格式日期转换为$(date +%Y-%m-%d %H:%M)格式?
日期格式转换实现方案
问题描述
我有一个包含约200行内容的大文件,部分内容示例如下:
started at Wed Jun 5 08:45:01 PM +0330 2024 -- ended at Wed Jun 5 10:35:34 PM +0330 2024. started at Thu Jun 6 01:30:01 AM +0330 2024 -- ended at Thu Jun 6 03:17:18 AM +0330 2024. started at Thu Jun 6 07:30:01 AM +0330 2024 -- ended at Thu Jun 6 09:19:19 AM +0330 2024. started at Thu Jun 6 01:30:01 PM +0330 2024 -- ended at Thu Jun 6 03:19:16 PM +0330 2024.
希望将文件中$(date)输出格式的日期,转换为$(date +%Y-%m-%d %H:%M:%S)格式,预期输出如下:
started at 2024-06-05 20:45:01 -- ended at 2024-06-05 22:35:34. started at 2024-06-06 01:30:01 -- ended at 2024-06-06 03:17:18. started at 2024-06-06 07:30:01 -- ended at 2024-06-06 09:19:19. started at 2024-06-06 13:30:01 -- ended at 2024-06-06 15:19:16.
请问该如何实现这一转换?是否可行?
实现方案
完全可行,以下是两种高效的命令行处理方法,适合200行规模的文件:
方法一:awk结合date命令逐行处理
利用awk提取日期字段,调用date命令完成格式转换:
awk '{ # 拼接起始日期的原始字符串 start_raw = $3 " " $4 " " $5 " " $6 " " $7 " " $8; # 调用date转换格式 cmd = "date -d \"" start_raw "\" +\"%Y-%m-%d %H:%M:%S\""; cmd | getline start_fmt; close(cmd); # 拼接结束日期的原始字符串 end_raw = $12 " " $13 " " $14 " " $15 " " $16 " " $17; cmd = "date -d \"" end_raw "\" +\"%Y-%m-%d %H:%M:%S\""; cmd | getline end_fmt; close(cmd); # 输出格式化后的行 print "started at " start_fmt " -- ended at " end_fmt "."; }' input.txt > output.txt
- 替换
input.txt为你的源文件路径,output.txt为结果文件路径 - 依赖GNU date(Linux默认支持),macOS用户需安装
coreutils后用gdate替换date
方法二:sed提取日期+shell循环转换
先用sed正则提取原始日期字符串,再通过shell循环调用date转换:
while read -r line; do # 提取起始日期原始字符串 start_raw=$(echo "$line" | sed -E 's/started at (.*) -- ended at.*/\1/') start_fmt=$(date -d "$start_raw" +"%Y-%m-%d %H:%M:%S") # 提取结束日期原始字符串 end_raw=$(echo "$line" | sed -E 's/.*-- ended at (.*)\./\1/') end_fmt=$(date -d "$end_raw" +"%Y-%m-%d %H:%M:%S") # 输出结果 echo "started at $start_fmt -- ended at $end_fmt." done < input.txt > output.txt
- 逻辑更直观,适合对正则熟悉的用户
- 同样需要GNU date,macOS替换为
gdate
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

