shell - 从完成时间值中减去开始时间值并将值添加为 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
解决方案
这可能对你有帮助。这个想法是使用具有时间功能的 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
。这就是我们首先执行替换的原因。一旦我们有了从纪元开始和结束时间的秒数,我们就可以减去它们以获得以秒为单位的持续时间。
注意:在夏令时期间可能会出现一些问题。这取决于您的系统设置。
注意:亚秒级精度被忽略。
推荐阅读
- c - C - 将结构变量从一个函数传递到另一个函数
- networking - VirtualService 路由只使用一台主机
- highcharts - Angular 8 和 Highcharts - 如何显示工具提示十字准线
- php - 由于重定向或服务器资源导致的流量丢失
- python - 如何使用 PySpark 在数据框中删除基于多个过滤器的列?
- laravel - 无法手动设置会话
- go - 为什么 http.NotFound() 将请求作为参数?
- docker-compose - 在 Localstack 上创建 Kinesis Stream 时 Kinesis 端口超时
- asp.net-core - 使缓存数据和依赖注入模式失效
- twos-complement - 0 减 0 在加减器电路中给出 1 的进位