perl
solution, assume que o arquivo de entrada é classificado por c1, c2, etc. Portanto, salvar em hash / array não é necessário
$ perl -lane '
$F[0] =~ s/\..*//;
if($F[0] ne $p && $. > 1)
{
print "$p $sum";
$sum = 0;
}
$sum += $F[2];
$p = $F[0];
END { print "$p $sum" }' ip.txt
c1 -0.618902
c2 -0.000118000000001395
c3 -0.7893993
c4 1.634748
-
-la
tira linhas novas da entrada e adiciona durante a impressão, divide a linha de entrada nos espaços e salva em@F
array -
$F[0] =~ s/\..*//
exclui todos os caracteres de.
para o primeiro campo -
if($F[0] ne $p && $. > 1)
se o número da linha de entrada não for de primeira linha e o primeiro campo não for o mesmo que o anterior- nome do campo de impressão e soma acumulada, variável de soma clara
- No final, imprima novamente para contabilizar a última entrada
Outra maneira seria não dividir a linha de entrada e usar o regex para extrair a chave e o valor necessários:
$ perl -lne '
($k, $v) = /^([^.]+)(?:\S+\s+){2}(\S+)/;
if($k ne $p && $. > 1)
{
print "$p $sum";
$sum = 0;
}
$sum += $v;
$p = $k;
END { print "$p $sum" }' ip.txt
c1 -0.618902
c2 -0.000118000000001395
c3 -0.7893993
c4 1.634748