Calcula a diferença de tempo entre duas linhas

0

carimbo de data / hora do grep em um arquivo, conforme indicado abaixo. Agora preciso calcular a diferença de tempo

dados do arquivo:

18:29:10
04:56:50

Eu tentei seguir o comando que sua saída está em menos:

awk -F":" 'FNR==1{split($0,a,":");sec1=a[1]*3600+a[2]*60+a[3]} FNR==2{split($0,b,":");sec2=b[1]*3600+b[2]*60+b[3];val=sec2-sec1;ho=int(val/3600);val=val%3600;mi=sprintf("%02d",(val/60));val=val%60;;print ho":"mi":"val}' file.txt

A saída é: -13: -32: -10

Eu quero a saída como: 10:27:40

    
por Vivek Nigam 04.01.2018 / 09:38

3 respostas

1

Assumindo que você quis dizer 10:27:40

awk -F: '
  {t[NR] = $3 + 60 * ($2 + 60 * $1)}
  END{
    d = t[2] - t[1]
    if (d < 0) d += 86400
    h = d / 3600
    d %= 3600
    m = d / 60
    s = d % 60
    printf "%02d:%02d:%02d\n", h, m, s
  }'
    
por 04.01.2018 / 11:07
3

Com a data do GNU:

string1="18:29:10"
string2="04:56:50"
StartDate=$(date -u -d "$string1" +"%s")
FinalDate=$(date -u -d "$string2" +"%s")
date -u -d "0 $FinalDate sec - $StartDate sec" +"%H:%M:%S"

Saída:

10:27:40

Créditos: link

    
por 04.01.2018 / 09:48
0

Apenas por diversão, usando dc :

$ cat file.txt
18:29:10
04:56:50
$ tr : \ <file.txt | dc -f - -e 'r60*+r60d**+r-r60*-r60d**-60dod24**+p'
 10 27 40
$ 

Este foi meu primeiro script dc . Experiência de aprendizagem divertida.

Outra abordagem usando dc :

$ cat file.txt 
18:29:10
04:56:50
$ cat time_subtract.dc 
[r60*+r60d**+]sb60d24**sd[ld+d0>n]snlbxsflbx_1*lf+60od0>np
$ tr : \ <file.txt | dc -f - -f time_subtract.dc 
 10 27 40
$ 

Por fim, bem embrulhado em um script de shell para que possa ser executado como ./script.sh file.txt ou some pipeline | ./script.sh , temos:

#!/bin/sh
cat "$@" |
tr : ' ' |
  dc -e '
[60+Lm1-Sm]SS
[60+Lh1-Sh]SM
[24+]SH
?SsSmSh
?SsSmSh
LsLs- d0>S Ss
LmLm- d0>M Sm
LhLh- d0>H Sh
[
]Ls[:]Lm[:]Lh
nnnnnn
'
    
por 04.01.2018 / 11:46

Tags