【问题标题】:awk to find date difference from two columnawk 从两列中查找日期差异
【发布时间】:2018-01-15 05:57:16
【问题描述】:

我的文件具有以下格式的值-

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

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

20180113 20180115 3.

请帮助使用 awk 命令。

【问题讨论】:

  • 你试过什么?使用列值作为date -d 的输入可以正常工作。减去自纪元以来产生的秒数,取绝对值(或根据您的喜好处理之前/之后),然后将结果秒差转换为天数。

标签: shell awk scripting


【解决方案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 是否应该像示例中那样产生 32 如数学所示。)

【讨论】:

  • wut? 行是因为天之间并不总是有 86400 秒。考虑 DST 和闰秒。
【解决方案2】:
$ 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") 作为开始日期,即当年的最后一天减去该值(获取当年剩余的天数),每年的开始日期和结束日期之间的最后一天,以及结束日期为一年中的哪一天。

【讨论】:

    【解决方案3】:

    关注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
    

    【讨论】:

    • 对于像 20 20180110 20180113 这样的数据;如何打印 20 3(第一个字段和日期差异)
    • @Bonomali,一定看到这个stackoverflow.com/help/someone-answers。您可以选择答案作为正确答案,也可以在 SO 中为鼓励而投票。
    • 这将在 2 个日期的午夜之间计算 86400 秒的间隔,但这与天数不同,结果并不总是整数。
    猜你喜欢
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多