Linux下计算CSV文件中UTC日期天数差并新增字段
批量计算CSV中日期字段的天数差并新增字段
我有一个包含两个日期字段的CSV文件,日期格式为UTC(如2011-04-05 21:13:50.597 UTC),需要计算每行两个日期的天数差并添加为新字段。
单个日期差可通过以下命令计算:
let DIFF=$(date -d "2011-04-05 21:13:50.597 UTC" +%s)-$(date -d "2011-04-05 21:44:36.257 UTC" +%s); echo $DIFF
批量处理时多次报错:
- 执行
date -d $(awk -F, '{print$6}' sof10.csv) +"%s"时,报错:date: extra operand ‘21:13:50.597’ Try 'date --help' for more information.
- 执行
date -d "awk -F, '{print$6}' sof10.csv" +"%s"时,报错:date: invalid date ‘awk -F, '{print}' sof10.csv’
- 循环处理命令
cat sof10nc2.csv | while read line; do $(date -d $(echo $line | awk -F, '{print$6}')); done报错“date: extra operand ‘UTC’”
CSV示例内容:
Credit Memo No,title,sun,dep.,year,date1,order,sort,date2 4500233821,Sales Cloud - Enterprise Edition,24,2,4,2018-11-29 12:15:06.353 UTC,4500233821,7,2018-11-29 12:21:04.237 UTC 4500245641,Sales Cloud - Enterprise Edition,36,2,4,2018-11-29 12:15:06.353 UTC,4500245641,2,2018-11-29 12:21:18.113 UTC 4500242807,Sales Cloud - Enterprise Edition,0,2,1,2018-11-29 12:55:03.097 UTC,4500242807,1,2018-11-29 12:59:42.697 UTC 4500233852,Sales Cloud - Enterprise Edition,6,2,1,2018-11-29 12:55:03.097 UTC,4500233852,2,2018-11-29 13:05:22.943 UTC 4500234511,Sales Cloud - Enterprise Edition,36,0,0,2018-11-29 13:09:25.697 UTC,4500234511,, 4500242786,Sales Cloud - Enterprise Edition,30.6,2,1,2018-11-29 13:17:48.977 UTC,4500242786,1,2018-11-29 13:18:56.643 UTC 4500242786,Sales Cloud - Enterprise Edition,30.6,2,1,2018-11-29 13:17:48.977 UTC,4500242786,2,2018-11-29 13:24:55.31 UTC 4500253356,Sales Cloud - Enterprise Edition,6,1,1,2018-11-29 13:28:45.723 UTC,4500253356,2,2018-11-29 13:52:13.413 UTC
正确的批量处理命令
使用awk结合date命令完成批量计算,同时兼容空值场景:
awk -F, ' BEGIN {OFS=","} NR==1 {print $0,"days_diff"; next} { if ($6 != "" && $9 != "") { cmd1 = "date -d \"" $6 "\" +%s" cmd1 | getline ts1 close(cmd1) cmd2 = "date -d \"" $9 "\" +%s" cmd2 | getline ts2 close(cmd2) diff_sec = ts2 - ts1 diff_days = diff_sec / 86400 # 1天=86400秒 print $0, diff_days } else { print $0, "" # 日期为空时输出空值 } } ' sof10.csv > output.csv
命令说明
- 表头处理:首行添加
days_diff字段名,保证CSV格式一致性。 - 空值判断:仅当
date1(第6列)和date2(第9列)均不为空时执行计算,避免报错。 - 时间戳转换:通过
getline调用date命令将UTC日期转为秒级时间戳,计算差值后转成天数。 - 资源释放:每次调用
date后执行close(cmd),避免占用过多系统资源。
之前命令出错原因
- 多日期参数问题:
awk输出多行日期时,date无法同时处理多个参数,导致参数拆分错误。 - 字符串解析错误:把
awk命令本身当作日期字符串传入,date无法解析该格式。 - 空格拆分问题:
echo $line会将空格作为分隔符,把日期拆分为多个参数传入date,触发"extra operand"错误。
内容的提问来源于stack exchange,提问作者Ohad Shachar
相关产品推荐
相关产品推荐

