从完成时间值中减去开始时间值,并将这些值作为新列添加到Unix的CSV文件中

时间:2018-11-08 11:44:28

标签: shell

我有一个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

1 个答案:

答案 0 :(得分:0)

这可能对您有帮助。这个想法是使用具有时间功能的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形式的字符串。这就是为什么我们首先执行替换。一旦有了从开始到结束的时间点的秒数,我们就可以减去它们来获得以秒为单位的持续时间。

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

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