我有两列,如下所示,其中包含作业提交日期。
NAME SUBMIT_TIME
Job1 Apr 25 11:30
Job2 Apr 25 16:30
我需要一个警报,如果当前日期/时间的时差超过 60 分钟,就会触发该警报。
请帮我计算另一列中与当前日期/时间的时差(以分钟为单位)
例如,我需要有一列作为与当前日期/时间的时差。假设一个作业从 11:30 开始运行,现在是 13:30,所以它应该给出 120 分钟作为差异
答案1
如果您的支持时间版本awk
有效,并且假设您缺少的年份信息是当前年份,那么您可以执行以下操作:
$ awk -F'[ :]' 'BEGIN{nowtime=systime();
mths="JanFebMarAprMayJunJulAugSepOctNovDec";
}
/[Jj]ob/ {$2=(match(mths,$2)+2)/3;
jobtime=mktime(2022" "$2" "$3" "$4" "$5" "0, 1);
print (nowtime-jobtime)/60;
}
' datafile
如果这种硬编码缺失年份的解决方案对您不满意,因为年份更改(根据我在评论中的查询)没有正确涵盖,则建议更改数据文件的格式,其中包含作业提交日期,其中包含年份格式YYYY
。
注意:
当 Awk 配备了 GNU 版本中的时间函数时,它会在计算时间增量时进行标准化,这意味着它在更改月份或年份时会考虑不同长度的月份以及闰年。为此,当然需要一个带有日期戳的作业提交数据文件,其中包括年份信息首先。
编辑:
刚刚注意到 OP 请求在附加列中提供柱状输出,其中时间增量以分钟为单位。修改后的代码为:
$ awk -F'[ :]' 'BEGIN{nowtime=systime(); mths="JanFebMarAprMayJunJulAugSepOctNovDec";}
NR==1 {printf "%s %s\n",$0,"DELTA(min)"}
/[Jj]ob/ {mo=(match(mths,$2)+2)/3;
jobtime=mktime(2022" "mo" "$3" "$4" "$5" "0, 1);
printf "%s %-4.1f\n",$0,(nowtime-jobtime)/60;
}
' datafile
NAME SUBMIT_TIME DELTA(min)
Job1 Apr 25 11:30 410.2
Job2 Apr 25 16:30 110.2
时差 ( delta
) 数字适用于提供的示例数据文件和(我的)系统时间。
编辑:根据 @EdMorton 的建议,
我将 UTC TZ 标志合并1
到代码中作为mktime()
函数的第二个参数,假设主机 TZ 设置对应于 UTC 时间戳。