我的文件包含以下格式的值 -
datecolumn1 datecolumn2
20140202 20180113
20140202 20180113
20140202 20180113
20131202 20180113
20140331 20180113
我想减去$ 3- $ 2来查找总天数。输出如下 -
20180113 20180115 3.
请帮助awk命令。
答案 0 :(得分:1)
使用GNUawk,mkdate
和FIELDWIDTHS
分隔日期部分。由于$4
是一个空格,因此它被mktime
中的空格滥用,因为它比" "
更短(:
$ awk '
BEGIN{ FIELDWIDTHS="4 2 2 1 4 2 2" }
{
print $0,(mktime($5 $4 $6 $4 $7 " 0 0 0")-mktime($1 $4 $2 $4 $3 " 0 0 0"))/86400
}' file
datecolumn1 datecolumn2 0
20140202 20180113 1441
20140202 20180113 1441
20140202 20180113 1441
20131202 20180113 1503
20140331 20180113 1384.04 # wut?
20180113 20180115 2
(我不确定20180113 20180115
是否应该像示例中那样生成3
,或者按照数学要求生成2
。
答案 1 :(得分:1)
$ cat tst.awk
function secs(d) { return mktime(substr(d,1,4)" "substr(d,5,2)" "substr(d,7)" 0 0 0") }
{ print $1, $2, int((secs($2) - secs($1)) / (24 * 60 * 60)) }
$ awk -f tst.awk file
datecolumn1 datecolumn2 0
20140202 20180113 1441
20140202 20180113 1441
20140202 20180113 1441
20131202 20180113 1503
20140331 20180113 1384
请注意,以上是天数差异的近似值,但它不能准确计算DST。我刚刚使用它,因为你似乎对这种近似感到满意,但如果你想让结果准确,你需要一个不同的时间计算,这将涉及使用strftime("%j")
作为开始日期,那一年的最后一天减去该值(以获得该年剩余的天数),开始日期和结束日期之间每年的最后一天,以及结束日期的年份。
答案 2 :(得分:0)
关注awk
可能会对您有所帮助,以获得日期之间的天数差异(您在帖子中发布的格式)。此代码也是在GNU awk
中创建和测试的。
TZ=PST awk '
FNR>1{
split($1,date,"");
split($2,date1,"");
print (mktime(date1[1] date1[2] date1[3] date1[4]" " date1[5] date1[6]" " date1[7] date1[8] " " "00 00 00")\
-mktime(date[1] date[2] date[3] date[4]" " date[5] date[6]" " date[7] date[8] " " "00 00 00"))\
/(24*60*60);
}' Input_file