Awk para coluna média com base na chave na segunda coluna

1

Eu tenho

Sample_A   100
Sample_A   200
Sample_B   300
Sample_B   100

E eu quero imprimir a média dos valores na linha 2 para cada chave na linha 1

Sample_A   150
Sample_B   200

Eu posso imprimir as somas dos valores na linha 2 para cada chave na linha 1 usando a excelente resposta para outra pergunta: Soma da primeira coluna com base na segunda coluna

O comando é:

awk 'NR { k = $1; cnt[k] += $2 } END { print; for (k in cnt) print k,cnt[k]}' File.txt

E isso produz

Sample_A  300
Sample_B  400

Mas, para calcular a média, preciso de uma maneira de salvar o número de ocorrências da chave, algo como

awk 'NR { k = $1; cnt[k] += $2; count(k)=$2} END { print; for (k in cnt) print k,cnt[k]/count(k)}' File.txt

Mas meu código count(k) é uma espécie de cena no escuro e não funciona.

    
por Heather Rose Kates 30.08.2018 / 19:29

2 respostas

1

Com awk você pode fazer:

awk '{seen[$1]+=$2; count[$1]++} END{for (x in seen)print x, seen[x]/count[x]}' infile
Sample_A 150
Sample_B 200

Ou usando o GNU datamash :

datamash -t' ' --sort --group 1 mean 2 <infile
Sample_A 150
Sample_B 200
    
por 30.08.2018 / 19:39
0
$ awk '{ sum[$1] += $2; count[$1] += 1 } END { for ( key in count ) { print key, sum[key] / count[key] } }' input
Sample_A 150
Sample_B 200

Para obter uma média, você precisa de duas coisas: uma contagem do número de entidades em média e a soma desses valores. Usamos uma matriz, count para a primeira e uma matriz sum para a última. As chaves em cada matriz são atribuídas à primeira coluna no seu arquivo de dados.

Em seguida, usamos uma cláusula END quando os dados estão sendo coletados para examinar cada matriz para obter as somas e contagens, dividir uma pela outra e exibir os resultados.

O script awk , reformatado para não estar em uma linha, é assim:

{ 
  sum[$1] += $2 
  count[$1] += 1
} 
END { 
  for (key in count) { 
    print key, sum[key] / count[key] 
  } 
}
    
por 30.08.2018 / 19:41