Frequência de “A e B” para cada caractere específico de outra coluna

0

Eu queria saber a frequência de A e B na coluna $ 3 e $ 4 para cada personagem diferente presente na coluna $ 1. Linha de comando no linux.

Exemplo minha entrada:

ID01 a1 A B
ID01 a2 A B
ID01 a3 A B
ID02 a1 B B
ID02 a2 B B
ID02 a3 B B
OA03 a1 A A
OA03 a2 A A
OA03 a3 A A
EA04 a1 -- --
EA04 a2 -- --
EA04 a3 -- --

Eu quero essa saída :

ID01 A 0.50
ID01 B 0.50
ID02 A 0.00
ID02 B 1.00
OA03 A 1.00
OA03 B 0.00
EA04 A 0.00
EA04 B 0.00

Como eu posso fazer isso? Obrigada!

    
por Amanda Botelho Alvarenga 04.10.2016 / 13:10

1 resposta

2

Uma maneira de adaptar a solução awk baseada em matriz associativa seria concatenar o conteúdo de $3 e $4 para cada $1 e, em seguida, a END aproveitar o fato de que gsub retorna o número de substituições para contar ocorrências de A e B nas respectivas strings . Por exemplo:

awk '{
  a[$1]=a[$1]$3$4; 
  next;
} 
END{
  for (i in a) {
  n = length(a[i]) == 0 ? 1 : length(a[i]); # avoid div-by-zero
  printf "%s A %.1f\n", i, gsub(/A/,"",a[i])/n; 
  printf "%s B %.1f\n", i, gsub(/B/,"",a[i])/n;}
}' input
EA04 A 0.0
EA04 B 0.0
OA03 A 1.0
OA03 B 0.0
ID01 A 0.5
ID01 B 0.5
ID02 A 0.0
ID02 B 1.0
    
por 04.10.2016 / 16:13