Calcula a diferença de DateTime entre dados de dois arquivos

1

Eu tenho dois arquivos File1 & Arquivo2 e Arquivo1 possuem dados como

"Start Date & Time" = 1804030000

e File2 possuem dados como

"End Date & Time" = 1804030400

Ambos os arquivos têm a mesma quantidade de linhas que são quase 300 mil linhas. Agora eu quero calcular a diferença de tempo subtraindo (data e hora de término (arquivo2) - StartDate & Time (arquivo1)) e armazene o resultado em um novo arquivo linha a linha.

Formato de data e hora em ambos os arquivos, como (yymmddhhmm).

    
por Faizan Naseem 06.04.2018 / 06:33

2 respostas

0

Um pequeno executável: busybox é capaz de analisar formatos de data com a opção -D.
O formato da data dos arquivos é %y%m%d%H%M

$ busybox date -uD %y%m%d%H%M -d "1804040400"
Wed Apr  4 04:00:00 UTC 2018

Usando isso no awk:

$ awk 'BEGIN{  a="busybox date -uD %y%m%d%H%M +%s -d " }
         { b=a $6  ; b | getline sd ; close(b)
           b=a $NF ; b | getline ed ; close(b)
           print(ed,sd,ed-sd)
         }' < <(paste infile[12])

1522814400 1522713600 100800

Observação: o uso da opção -u evitará alguns efeitos locais e de horário de verão. Na maioria das vezes, isso não altera a diferença final, pois ambos os comandos de data são executados com o mesmo ambiente TZ.

    
por 06.04.2018 / 23:08
0

Eu usaria awk e primeiro converti Start Date & Time e End Date & Time em uma data válida que o comando date possa entender neste formato yymmdd HH:mm e converta cada para epoch tempo para calcular a diferença em segundos .

$ awk '{endDateInEpoch="date -d""\""substr($NF,1,6)" "substr($NF,7,2)":"substr($NF,9,2)"\""" +%s";
        endDateInEpoch |getline endDateInEpoch;close(endDateInEpoch); 

        startDateInEpoch="date -d""\""substr($6,1,6)" "substr($6,7,2)":"substr($6,9,2)"\""" +%s";
        startDateInEpoch |getline startDateInEpoch;close(startDateInEpoch);

        sec=endDateInEpoch-startDateInEpoch; sec*=(sec)?1:-1; print sec" seconds"
}' <(paste file[12])
100800 seconds

Note que primeiro eu faço paste file[12] para colar arquivos1 e arquivo2 lado a lado, que resultarão como abaixo, então passe para awk input, em que $NF aponta para o último campo 1804040400 como Data de término & Horário e campo # 6 1804030000 como Data de início & Tempo com espaços em branco como delimitadores de campo, que é o% e_perador S do awk padrão: FS F e :

"Start Date & Time" = 1804030000        "End Date & Time" = 1804040400
    
por 06.04.2018 / 08:18

Tags