Como multiplicar e somar os dados da coluna usando awk e / ou sed?

2

Eu tenho várias colunas de dados. Eu sempre tenho o mesmo número de linhas (digamos 5). Na segunda coluna, quero multipy o primeiro valor por 5, em seguida, o segundo valor por 4, o terceiro valor por 3, etc. Então eu quero somar esses valores, e dividir pela soma dos valores na segunda coluna . Como eu faria isso em sed e / ou awk?

Exemplo:

4 5 7 1 2 3
5 1 2 3 1 2
4 2 3 6 1 2
3 4 1 6 3 3
2 3 1 2 1 6

Resposta: (5*5 + 4*1 + 3*2 + 2*4 + 1*3)/(5 + 1 + 2 + 4 + 3) = 3.067

    
por markn 19.02.2014 / 23:24

2 respostas

4

Substitua 6 por total (número de linhas + 1), se necessário:

awk '{mult+=$2*(6-NR); sum+=$2;} END {print mult/sum;}' yourfile.txt 

Exibe: 3.06667

    
por 19.02.2014 / 23:58
2

Se no caso o número total de linhas não for conhecido

$ cat file
4 5 7 1 2 3
5 1 2 3 1 2
4 2 3 6 1 2
3 4 1 6 3 3
2 3 1 2 1 6

$ awk 'FNR==NR{t = NR+1;next}{mult+=$2*(t-FNR);sum+=$2} 
       END{print mult/sum}' file{,}
3.06667

Explicação

awk 'FNR == NR{t=NR+1;next}

FNR variable - > Número da linha atual no arquivo atual

NR variable - > O número total de linhas vistas até o momento

A condição FNR == NR só pode ser verdadeira enquanto o awk estiver lendo o primeiro arquivo de argumento

t=NR+1 - > variável t contém contagem de linhas +1 extra, pois é necessário em nosso contexto atual

next - > Pára o processamento do registro de entrada atual e prossegue com o próximo registro de entrada

mult+=$2*(t-FNR) - > a variável mult contém alguns (5*(t-FNR) + ..... + 4*1 + 3*2 + 2*4 + 1*3)

sum+=$2 - > variável sum contém soma de coluna2

END - > Uma regra END é executada uma vez, depois que toda a entrada foi lida

print mult/sum - > Finalmente imprima mult / soma

file{,} - > você também pode arquivar file file mas eu usei atalho este truque bash você pode dizer, tente echo file{,} e echo file{,,} no seu terminal.

Boa sorte

Akshay.

    
por 20.02.2014 / 12:45

Tags