Como somar os tempos em um arquivo de texto usando a linha de comando?

2

Eu tenho um arquivo de texto contendo tempos de voo, horas e minutos separados por sinal de dois pontos, um por linha:

00:50
00:41
00:43
00:50
01:24

No momento, estou usando o aplicativo Numbers da Apple com uma fórmula simples para calcular o tempo total (resultado sendo 4:28 para os dados de exemplo acima).

No entanto, eu queria saber se há uma maneira mais fácil de conseguir isso. Um script perl funcionaria bem, mas que tal usar comandos shell e / ou scripts do Unix? Eu estou basicamente procurando por algo curto e simples.

Sim, posso gerenciar com o Numbers, mas seria bom conhecer e aprender:).

p.s. Postando script perl para conseguir isso caso alguém precise:

#! /usr/bin/perl
while (<>) {
  chomp;
  ($hours, $minutes) = split (/:/, $_);
  $totalhours += $hours;
  $totalminutes += $minutes; 
}
while ($totalminutes > 59) {
  $totalhours++;
  $totalminutes -= 60;
}
printf ("%d:%02d\n", $totalhours, $totalminutes);
    
por Simo A. 28.09.2014 / 20:53

3 respostas

4

Como você nota, existem muitas possibilidades. As seguintes versões com o awk são aproximadamente equivalentes ao perl que você incluiu na sua pergunta:

  1. (com o GNU awk):

    awk -F : '{acch+=$1;accm+=$2;} ENDFILE { \
    print acch+int(accm/60)  ":" accm%60; }' [inputfile]
    
  2. (com "POSIX" awk):

    awk -F : '{acch+=$1;accm+=$2;print acch+int(accm/60) \
                 ":" accm%60; }' [inputfile] | tail -1
    
por 28.09.2014 / 21:18
1

Uma versão "one-liner" no Perl:

perl -F: -lane '$a+=$F[0]*60+$F[1];END{printf "%02d:%02d\n",$a/60,$a%60}' file
    
por 28.09.2014 / 21:29
1

Isso deve funcionar em qualquer shell compatível com POSIX:

#!/bin/sh
# usage: time-add.sh < times.txt
sum=0
while IFS=: read -r hours minutes; do
    sum=$(($sum + $hours * 60 + $minutes))
done
total=$(($sum / 60)):$(($sum % 60))
echo $total
    
por 29.09.2014 / 13:55