Versão mais curta em que não atribuímos valores vazios a zero:
perl -lane '
++$h{$i[!$h{$F[0]} ? @i : -1]=$F[0]}{$F[1]}}{
print join "\t", "\t", @h = sort keys %{ +{ map { map { $_ => 1 } keys %$_ } values %h } };
print join "\t", $_, @{$h{$_}}{@h} for @i;
' yourfile
perl -lane '
$i[@i]=$F[0] unless $h{$F[0]};
++$h{$F[0]}{$F[1]}}{
@h = sort keys %{ +{ map { map { $_ => 1 } keys %$_ } values %h } };
print join "\t", "\t", @h;
for my $date ( @i ) {
my $href = $h{$date};
print join "\t", $date, map { $href->{$_} || 0 } @h;
}
' yourfile
Resultados
A B C
2017-07-30 3 2 1
2017-07-31 1 2 2
Estruturas de dados:
- hash
%h
que tem keys
as datas e valores sub-hashes cujas chaves são A, B, C, etc. e os valores correspondentes são suas respectivas contagens nessas datas específicas.
%h = (
2017-07-30 => {
A => 3,
B => 2,
C => 1,
},
...
);
- Matriz
@i
, que armazena as datas na ordem em que foram encontradas.
Nós empurramos as datas para o array @i
apenas quando não é visto antes do IOW, quando é visto pela primeira vez apenas. A ordem é fornecida pela posição da matriz.
- A matriz
@h
tem as chaves uniquificadas depois de totalizar todas as chaves "A", "B", "C", etc. do hash %h
.