adiciona linhas para cada 3 linhas [duplicadas]

0

Eu tenho um documento como este

1 0.2
1 0.3
1 0.1
2 0.8
2 0.5
2 0.3

Eu quero adicionar as linhas se a primeira coluna for a mesma e gerar algo como isto

1 0.6
2 1.6

Como posso fazer isso com o awk? Ou talvez seja mais fácil com outras ferramentas?

PD: a primeira coluna é a mesma para cada 3 linhas sempre, então talvez faça uma matriz que adicione $ 2 até que a contagem da linha vá para 3 e imprima? algo assim awk 'BEGIN {x=0,n=1} {n++,x=x+$3}' mas com alguma condição?

    
por cloudy_fog 28.07.2016 / 13:59

2 respostas

1

Podemos criar uma matriz de "primeiro valor, soma de segundo valor" e, depois que o arquivo inteiro for lido, podemos imprimir os resultados

awk '{a[$1]+=$2} END { for (v in a) { print v,a[v]}}' datafile

Se você quiser que a saída seja classificada, a maneira mais fácil é canalizar isso por meio de ordenação:

awk '{a[$1]+=$2} END { for (v in a) { print v,a[v]}}' datafile | sort -n
    
por 28.07.2016 / 14:18
0

Eu faria isso com perl :

#!/usr/bin/env perl

use strict;
use warnings 'all'; 

my %sum_of;
while ( <DATA> ) {
   my ( $key, $value ) = m/(\d+) ([\d\.]+)/; 
   $sum_of{$key} += $value;
}

print "$_ $sum_of{$_}\n" for sort keys %sum_of;


__DATA__
1 0.2
1 0.3
1 0.1
2 0.8
2 0.5
2 0.3

Isso fornece a saída desejada.

Como um forro:

perl -lne '($key, $value) = split; $sum_of{$key}+=$value; END {print "$_ $sum_of{$_}" for sort keys %sum_of}'
    
por 28.07.2016 / 14:28