Multiplique as linhas de uma coluna em um bloco diferente de dados, some-as e obtenha a média?

1

Eu tenho um pedaço de dados que se parece com isso:

924
777 777 777 8445.65349
P 9.44657 -0.840283 -0.394467
C 4.0555 -0.683104 -1.70917
P 7.5169 3.54172 2.77681
C 3.21536 2.67146 2.20242
P 4.33641 7.62012 6.10004
C 0.851002 3.61045 5.6153
P -0.884031 7.93847 9.1465

e isso continua até que outro trecho comece:

C -2.60284 -2.72416 5.53391
P -7.1821 -5.0307 2.45961
C -4.15764 -0.916509 2.41971
P -7.95623 -0.58521 -2.00452
C -3.06671 0.655337 -1.24124    <-- (here is the end of first chunk)
924                             <-- (here another section starts)
777 777 777 8175.13598
P 9.77168 -2.01085 -0.577195
C 5.1768 -1.76539 -1.75107
P 7.16094 2.89923 2.55963
C 2.93574 1.47131 2.21471
P 3.93407 7.32403 5.62331

Eu quero multiplicar as entradas de cada linha que começa com P até a próxima P (de forma consecutiva) e adicioná-las juntas e obter a média.

Por exemplo:

Se este for o primeiro P (P 9.44657 -0.840283 -0.394467) e este for o segundo P (P 7.5169 3.54172 2.77681), faça ... (9.44657 × 7.5169) + (-0.840 × 3.541) + (-0.394 × 2.77) ... e repita-o para o segundo P e terceiro P, e assim por diante ... em seguida, adicione-os e obtenha a média, e faça isso para muitos trechos de dados que seguem o mesmo padrão.

É possível fazer isso com awk ?

    
por amir 29.10.2014 / 16:11

1 resposta

0

O seguinte ajuda você a resedir a soma da produção de todos os elementos da linha que começa com P e sua quantidade.

awk '/^P/{for (n=2;n<=NF;n++){sum+=arr[n]*$n;arr[n]=$n;t++}} END{print sum t}'

Não estou bem entendido o que você quer dizer com chunks , mas se você quiser receber uma soma não para arquivo no total, mas para uma parte separada, você está livre para modificar o programa como segue

awk '/^924$/ && sum != 0 {print sum t; sum=0; t=0} \
     /^P/{for (n=2;n<=NF;n++){sum+=arr[n]*$n;arr[n]=$n;t++}} \
     END{print sum t}'
    
por 29.10.2014 / 21:06

Tags