首页 > 解决方案 > 从完成时间值中减去开始时间值并将值添加为 Unix CSV 文件中的新列

问题描述

我有一个 CSV 文件(来自 SQL 查询的输出)。它在不同的列中给出了开始时间和结束时间值。我需要获取开始时间和结束时间的差异,并根据差异值生成 HTML 报告。为此,我想包含一个新列,它将保存“完成时间”-“开始时间”的输出。列如下。时间格式为以下格式

START TIME: 2018-11-08 01:45:39.0
FINISH TIME:2018-11-06 06:48:20.0

我使用了下面的代码,但我不确定它是否返回正确的值。对此的任何帮助将不胜感激。

以下是我的 CSV 文件的第一 3 行

DESCRIPTION,SCHEDULE,JOBID,CLASSIFICATION,STARTTIME,FINISHTIME,NEXTRUNSTART,SYSTEM,CREATIONDATETIME,
DailyClearance,Everyday,XXXXXX, Standard,2018-11-08 01:59:59.0,2018-11-08 02:00:52.0,CAK-456,018-11-08 04:28:18,
Miscellinious,Everyday,XXXXXX, standart,2018-11-08 02:59:59.0,2018-11-08 03:29:39.0,2018-11-09 03:00:00.0,CAT-251,2018-11-08 04:28:18,

这是我的尝试

  awk 'NR==1 {$7 =  "DIFFMIN"} NR > 1 { $7 = $5 - $6} 1' <inputfile.csv

标签: shell

解决方案


这可能对你有帮助。这个想法是使用具有时间功能的 GNU awk。

awk 'BEGIN{FS=OFS=","}
     (NR==1){print $0 OFS "DURATION"; next}
     { tstart = $5; tend = $6
       gsub(/[-:]/," ",tstart); tstart=mktime(tstart)
       gsub(/[-:]/," ",tend);   tend  =mktime(tend)
       $(NF+1)=tend-tstart;
       print
     }'

这应该添加额外的列。时间将以秒表示。

这个想法是选择这两列并将它们转换为自纪元 (1970-01-01T00:00:00) 以来的秒数。这是使用mktime需要格式字符串的函数来完成的YYYY MM DD hh mm ss。这就是我们首先执行替换的原因。一旦我们有了从纪元开始和结束时间的秒数,我们就可以减去它们以获得以秒为单位的持续时间。

注意:在夏令时期间可能会出现一些问题。这取决于您的系统设置。

注意:亚秒级精度被忽略。


推荐阅读