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
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
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.