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

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

命令说明

  1. 表头处理:首行添加days_diff字段名,保证CSV格式一致性。
  2. 空值判断:仅当date1(第6列)和date2(第9列)均不为空时执行计算,避免报错。
  3. 时间戳转换:通过getline调用date命令将UTC日期转为秒级时间戳,计算差值后转成天数。
  4. 资源释放:每次调用date后执行close(cmd),避免占用过多系统资源。

之前命令出错原因

  • 多日期参数问题:awk输出多行日期时,date无法同时处理多个参数,导致参数拆分错误。
  • 字符串解析错误:把awk命令本身当作日期字符串传入,date无法解析该格式。
  • 空格拆分问题:echo $line会将空格作为分隔符,把日期拆分为多个参数传入date,触发"extra operand"错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:41:25