【问题标题】:How to subtract two times in Unix to get the completion time for autosys job如何在 Unix 中减去两次以获得 autosys 作业的完成时间
【发布时间】:2017-10-06 02:54:38
【问题描述】:

我想计算一个 autosys 作业的完成时间:

我在文件中有以下工作状态:

$cat rough
abc_why_the_infra_dnjob               10/05/2017 10:41:36  10/05/2017 12:52:02  SU
abc_why_the_avloqhk_dnjob             10/05/2017 09:53:36  10/05/2017 10:33:03  SU
abc_why_the_avlogsg_dnjob             10/05/2017 10:33:14  10/05/2017 10:41:01  SU
abc_why_the_avalokin_dnjob            10/05/2017 09:37:36  10/05/2017 09:53:06  SU
abc_why_the_mastercard_dnjob          10/05/2017 13:29:36  10/05/2017 14:21:02  SU
abc_why_the_tcs_dnjob                 10/05/2017 03:13:36  10/05/2017 03:22:02  SU
abc_why_the_cogni_dnjob               10/05/2017 09:20:36  10/05/2017 09:37:02  SU
abc_why_the_dnjob                  10/05/2017 03:41:36  10/05/2017 04:08:02  SU

我写了下面的脚本来计算它:


$ cat sod.sh

#!/bin/bash

number=`cat rough| wc -l`

for i in `seq 1 $number`
do

        job_name=`awk -F' ' '{print $1}' rough | sed -n "$i p"`

        START_DATE=`awk -F' ' '{print $2}' rough | sed -n "$i p"`
        END_DATE=`awk -F' ' '{print $4}' rough | sed -n "$i p"`

        START_TIME=`awk -F' ' '{print $3}' rough | sed -n "$i p"`
        END_TIME=`awk -F' ' '{print $5}' rough | sed -n "$i p"`

        if [[ $START_DATE == $END_DATE ]]
        then
                T1=`date --date="${END_DATE} ${END_TIME}" "+%s"`
                T2=`date --date="${START_DATE} ${START_TIME}" "+%s"`

                TIME_DIFFERENCE=`expr $T2 - $T1`
                COMPLITION_TIME=`date -d "@${TIME_DIFFERENCE}" "+%H:%M:%S"`

                echo $COMPLITION_TIME
        fi
done

输出:

$./sod.sh
03:19:34
04:50:33
05:22:13
05:14:30
04:38:34
05:21:34
05:13:34
05:03:34

我现在的查询:输出不正确,你能建议我吗? 我期待正确的答案,例如: 02:11 >> 第一份工作

【问题讨论】:

  • 您是否有过从第 1 天 23:04:59 开始到第 2 天 00:34:31 结束的工作?你的脚本效率低得惊人。您可以使用单个 awk 脚本处理数据。
  • 没有乔纳森,这些作业从 IST 时间早上 6 点开始,大部分在 IST 下午 6 点之前完成,并且这些作业使用重用文件作业(前一天文件),因此没有机会长时间运行 2 天组合。
  • @Jonathan,我只是想知道我们如何在 unix 中在冗长的变电站 expr $H2 - $H1expr $M2 - $M1expr $S2 - $S 等旁边减去时间实体。..
  • 就像我向你展示的那样。将时间转换为与某个参考时间(午夜,或“时代”- 1970-01-01 00:00:00 +00:00)相比的偏移量(以秒为单位)。然后取这些偏移量之间的差异,并将其格式化为小时、分钟和秒。

标签: datetime unix autosys


【解决方案1】:

你的机器上有 GNU Awk 吗?如果你不这样做会很辛苦 - 但如果你这样做会更容易(虽然不容易),因为它支持时间操纵 - 请参阅手册中的time functions

文件中的日期格式没有帮助 - 甚至不清楚它是 mm/dd/yyyy 还是 dd/mm/yyyy 格式,但考虑到该问题是在 2017 年 10 月 5 日提出的,很可能是 mm/dd/yyyy。

这个使用gawk 的脚本(GNU Awk - 你也许可以只使用awk)来完成这项工作。它使用两个用户定义的函数和mktime()。它不使用strftime(),因为它在本地时间有效,这对我来说不正确,可能对你也不正确(但否则很容易使用strtime("%H:%M:%S", t2 - t1) 来获取hh:mm 中的时间值:ss 单位)。

gawk '
function cvt_mdy_hms(d0, t0,    d1, t1, dt, rv){ #d0="10/05/2017"; t0="10:41:36";
    split(d0, d1, "/"); split(t0, t1, ":");
    dt = d1[3] " " d1[1] " " d1[2] " " t1[1] " " t1[2] " " t1[3];
    rv = mktime(dt);
    # print "[", dt, "] =", rv;
    return rv
}
function hms(secs,    hh, mm, ss, rv) {
    hh = int(secs / 3600);
    mm = int(secs / 60) % 60;
    ss = secs % 60;
    rv = sprintf("%.2d:%.2d:%.2d", hh, mm, ss);
    # print "[", secs, " = ", rv, "]";
    return rv;
}
NF == 6 { t1 = cvt_mdy_hms($2, $3); t2 = cvt_mdy_hms($4, $5);
  printf "%-30s  %2s  time %8s;  [%10s %8s] = %10d  [%10s %8s] = %10d; delta = %6d\n",
         $1, $6, hms(t2 - t1), $2, $3, t1, $4, $5, t2, t2 - t1;
}' data

给定您的数据文件(在一个名为 data 的文件中),输出为:

abc_why_the_infra_dnjob         SU  time 02:10:26;  [10/05/2017 10:41:36] = 1507225296  [10/05/2017 12:52:02] = 1507233122; delta =   7826
abc_why_the_avloqhk_dnjob       SU  time 00:39:27;  [10/05/2017 09:53:36] = 1507222416  [10/05/2017 10:33:03] = 1507224783; delta =   2367
abc_why_the_avlogsg_dnjob       SU  time 00:07:47;  [10/05/2017 10:33:14] = 1507224794  [10/05/2017 10:41:01] = 1507225261; delta =    467
abc_why_the_avalokin_dnjob      SU  time 00:15:30;  [10/05/2017 09:37:36] = 1507221456  [10/05/2017 09:53:06] = 1507222386; delta =    930
abc_why_the_mastercard_dnjob    SU  time 00:51:26;  [10/05/2017 13:29:36] = 1507235376  [10/05/2017 14:21:02] = 1507238462; delta =   3086
abc_why_the_tcs_dnjob           SU  time 00:08:26;  [10/05/2017 03:13:36] = 1507198416  [10/05/2017 03:22:02] = 1507198922; delta =    506
abc_why_the_cogni_dnjob         SU  time 00:16:26;  [10/05/2017 09:20:36] = 1507220436  [10/05/2017 09:37:02] = 1507221422; delta =    986
abc_why_the_dnjob               SU  time 00:26:26;  [10/05/2017 03:41:36] = 1507200096  [10/05/2017 04:08:02] = 1507201682; delta =   1586

也可以在 Perl 中轻松完成这项工作,在纯 Python 中也是如此。

【讨论】:

    【解决方案2】:

    我使用 Python 脚本得到了答案:

    >>> s1='10:41:36'
    >>> s2='12:52:02'
    >>> import datetime
    >>> import time
    >>> total_time=(datetime.datetime.strptime(s2,'%H:%M:%S') - datetime.datetime.strptime(s1,'%H:%M:%S'))
    >>> print total_time
    2:10:26
    

    【讨论】:

      猜你喜欢
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多