我有两个文件 File1 和 File2,File1 的数据如下
"Start Date & Time" = 1804030000
和 File2 的数据如下
"End Date & Time" = 1804030400
两个文件的行数相同,几乎为 300K 行。现在我想通过减去(结束日期和时间(文件2)-开始日期和时间(文件1))来计算时间差,并将结果逐行存储在新文件中。
两个文件中的日期时间格式如 (yymmddhhmm)。
答案1
一个小的可执行文件:busybox
能够使用 -D 选项解析日期格式。
文件日期的格式是%y%m%d%H%M
$ busybox date -uD %y%m%d%H%M -d "1804040400"
Wed Apr 4 04:00:00 UTC 2018
在 awk 中使用它:
$ awk 'BEGIN{ a="busybox date -uD %y%m%d%H%M +%s -d " }
{ b=a $6 ; b | getline sd ; close(b)
b=a $NF ; b | getline ed ; close(b)
print(ed,sd,ed-sd)
}' < <(paste infile[12])
1522814400 1522713600 100800
注意:使用该-u
选项将避免一些 DST 和局部影响。大多数情况下,它不会改变最终的差异,因为两个日期命令都是在相同的环境 TZ 下执行的。
答案2
我会使用awk
并首先将Start Date & Time
和转换End Date & Time
为有效的日期该date
命令可以理解这种格式yymmdd HH:mm
,然后将每个转换为时代计算差异的时间秒。
$ awk '{endDateInEpoch="date -d""\""substr($NF,1,6)" "substr($NF,7,2)":"substr($NF,9,2)"\""" +%s";
endDateInEpoch |getline endDateInEpoch;close(endDateInEpoch);
startDateInEpoch="date -d""\""substr($6,1,6)" "substr($6,7,2)":"substr($6,9,2)"\""" +%s";
startDateInEpoch |getline startDateInEpoch;close(startDateInEpoch);
sec=endDateInEpoch-startDateInEpoch; sec*=(sec)?1:-1; print sec" seconds"
}' <(paste file[12])
100800 seconds
请注意,我首先paste file[12]
粘贴两者文件1和文件2并排,结果如下所示,然后将其传递给awk
输入,其中$NF
指向最后一个字段1804040400
,如下所示结束日期和时间字段 #61804030000
为开始日期和时间使用空格作为字段分隔符,这是awk
默认的FS
F产量S迭代器:
"Start Date & Time" = 1804030000 "End Date & Time" = 1804040400