perl -F'\h+|[-.:]' -lane '
$h[keys %h]=$F[0] unless $h{$F[0]};
$h{$F[0]}[$_-1] += $F[$_] for 1..$#F}{for ( @h )
{
my @Arefs = map { \$_ } my($days, $hrs, $mins, $secs, $msec) = @{$h{$_}};
while ( $msec >= 1000 ) { $secs++; $msec -= 1000; }
while ( $secs >= 60 ) { $mins++; $secs -= 60; }
while ( $mins >= 60 ) { $hrs++; $mins -= 60; }
while ( $hrs >= 24 ) { $days++; $hrs -= 24; }
print $_, sprintf " %d-%02d:%02d:%02d.%03d", map $$_, @Arefs;
}
' text.file
perl -F'\h+|[-.:]' -lane '
$h[keys %h]=$F[0] unless $h{$F[0]};
$h{$F[0]}[$_-1] += $F[$_] for 1..$#F}{for ( @h )
{
use integer;
my @A = @{$h{$_}};
$A[0] += ($A[1] += ($A[2] += ($A[3] += $A[4]/1000)/60)/60)/24;
$A[4] %= 1000; $A[3] %= 60;$A[2] %= 60; $A[1] %= 24;
print $_, sprintf " %d-%02d:%02d:%02d.%03d", @A;
}
' text_file
Resultados
aaa 1-21:27:26.255
bbb 5-11:15:04.433
Explicação
- O separador de campos está definido para desmembrar os milissegundos, segundos, minutos, horas, dias e a primeira chave de campo.
- A linha de entrada é dividida e armazenada em uma matriz
@F
com os elementos:
$ F [0] - > tecla (aaa / bbb / etc.)
$ F [1] - > dias, $ F [2] - > horas, $ F [3] - > minutos, $ F [4] - > segundos, $ F [5] - > milissegundos.
- As chaves hash, por sua própria natureza, são acessadas não na ordem em que foram criadas. Portanto, temos uma matriz
@h
cujos elementos são hash %h
keys na ordem em que foram vistos.
- Hash
%h
é constituído assim:
%h = (
aaa => [ days, hours, minutes, seconds, milliseconds ],
bbb => [ ... ],
...
);