2017-10-06 2 views
0

Je veux calculer le temps d'achèvement pour un travail AutoSys:Comment supprimer deux fois Unix pour obtenir le temps d'achèvement pour le travail AutoSys

J'ai ci-dessous l'état de l'emploi dans le fichier:

$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 

Et je a écrit le scénario ci-dessous pour le calculer:


$ 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 

Sortie:

$./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 

Ma Recherche maintenant: La sortie est incorrecte peut vous me suggérer. J'attends les bonnes réponses comme: 02h11 >> pour un premier emploi

+0

Avez-vous déjà des emplois qui commencent à 23:04:59 le jour 1 et se terminent à 00:34:31 le jour 2? Votre script est terriblement inefficace. Vous pouvez traiter les données avec un seul script 'awk'. –

+0

Non Jonathan, Ces travaux démarrent à partir de 6 heures du matin et généralement terminés avant 18 heures IST, et ces travaux utilisent le fichier de réutilisation (fichier du jour précédent) donc aucune chance de fonctionner longtemps pour une combinaison de 2 jours. –

+0

@Jonathan, je suis juste curieux de savoir comment on peut soustraire l'entité temporelle en unix à côté de la longue sous-station 'expr $ H2 - $ H1',' expr $ M2 - $ M1', 'expr $ S2 - $ S' et ainsi sur .. –

Répondre

0

Je suis une réponse à l'aide d'un script 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 
1

Avez-vous GNU Awk sur la machine? C'est un travail difficile si vous n'avez pas - mais plus facile (mais pas facile) si vous le faites parce qu'il a un support pour la manipulation du temps - voir time functions dans le manuel. Le format de la date dans le fichier n'aide pas - on ne sait même pas si c'est le format mm/jj/aaaa ou jj/mm/aaaa, mais étant donné que la question a été posée le 10-10-2017 , il est très probable que mm/jj/aaaa. Ce script utilise gawk (GNU Awk - vous pouvez utiliser awk). Il utilise deux fonctions définies par l'utilisateur et mktime(). Il n'utilise pas strftime() parce que cela fonctionne en heure locale ce qui n'est pas correct pour moi et probablement n'est pas correct pour vous (mais il serait autrement tentant d'utiliser strtime("%H:%M:%S", t2 - t1) pour obtenir la valeur de temps en hh: mm: unités 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 

Compte tenu de votre fichier de données (dans un fichier appelé data), la sortie est:

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 

Il serait également possible de faire le travail en Perl sans trop de bruit, et en Python pur ainsi que.