Média de computação em uma lista de valores para cada valor

0

Eu tenho um arquivo enorme (50k linhas) com o seguinte formato:

52370581 2116
17996781 4314
47818829 2584
61421045 2158
...
25145813 2274

O primeiro valor pode estar presente várias vezes e eu quero calcular a média do segundo valor para cada primeiro valor, usando o terminal. Idealmente, eu quero a mediana, o min e max também. Eu posso fazer isso em todos os valores facilmente com awk , mas eu queria saber como fazer isso para cada valor.

    
por Julien Genestoux 11.05.2013 / 17:19

2 respostas

3
awk '{c[$1]++;s[$1]+=$2}END{for(i in c)print i,(s[i]/c[i])}' test.in

Mais claramente:

awk '
{ # Every line
    # Increment the key, add value to its sum
    count[$1]++
    sum[$1] += $2
}
END {
    # Go through all the numbers we saw
    for(number in count) {
        # Print the number followed by the average (sum/count) of its values
        print number, (sum[number]/count[number])
    }
}
' test.in

Observe que os números serão exibidos em ordem aleatória mais ou menos (algum hash das chaves). Obter min e max não é tão ruim, basta adicioná-los depois de count e sum no primeiro bloco. A mediana exige o rastreamento de todos os números. Você pode fazê-lo com uma matriz 2d (ou emulação do awk), mas vou deixar isso como um exercício para o leitor.

    
por 11.05.2013 / 19:17
0

Por avarage

awk '{if(NR==1){i=$1;}} {if($1~i){j+=$2;k++}} END{print "Average is " (j/k)}' <filename>

isto irá fornecer-lhe caso queira fazê-lo apenas para o valor na primeira linha. Em vez de NR==0 , se você passar uma variável, poderá fazê-lo para qualquer caso específico de linha. Agora, se você quiser fazer isso para cada linha, então o awk fará isso em uma passagem

awk '{value[$1]+=$2;count[$1]++} END{for(indx in value)print "Avarage of " indx " is " (value[indx]/count[indx])}' <filename>

o awk possui uma matriz bidimensional, mas eu não estou familiarizado com isso, então usando 2 matrizes para manter a soma dos elementos e contar. Qualquer outra operação, precisamos mudar o script baseado na operação

    
por 11.05.2013 / 18:20

Tags