awk从两列找到日期差异

时间:2018-01-15 05:57:17

标签: shell awk scripting

我的文件包含以下格式的值 -

datecolumn1     datecolumn2
20140202 20180113
20140202 20180113
20140202 20180113
20131202 20180113
20140331 20180113

我想减去$ 3- $ 2来查找总天数。输出如下 -

20180113 20180115 3.

请帮助awk命令。

3 个答案:

答案 0 :(得分:1)

使用GNUawk,mkdateFIELDWIDTHS分隔日期部分。由于$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