Contagem do número de entradas na coluna 2 onde a coluna 1 é semelhante

3

Estou tentando contar o número de entradas na coluna 2 para a mesma coluna1 e também o número de vezes que a primeira entrada na coluna2 para semelhante coluna1 ocorre.

Por exemplo, meu arquivo TSV de entrada é:

C1  NC01
    NC01
C2  NC01
    NC01
    NC02
C3  NC01
    NC02
    NC03

E minha saída desejada é:

C1  NC01  2  2
    NC01
C2  NC01  3  2
    NC01
    NC02
C3  NC01  3  1
    NC02
    NC03

Como posso fazer isso usando a linha de comando?

    
por Miss 15.05.2015 / 07:42

1 resposta

3

Use awk :

awk '{a[NR]=$0} {if(NF!=1){y=$2;x=$0;b[x]=1;c[x]=1}else{b[x]++;if(y==$1){c[x]++}}} END{for (n in a){z=a[n];print z" "b[z]" "c[z]}}' file

É certo que não é o mais simples, mas funciona para mim com a sua contribuição.

Explicação:

  • {a[NR]=$0} : primeiro carregue todo o conteúdo do arquivo em uma matriz chamada a .
  • if(NF!=1) : Se for uma linha em que temos várias colunas (mais de uma) ...
  • {y=$2;x=$0;b[x]=1;c[x]=1} : ... define uma variável y para o segundo valor da coluna que queremos contar e uma variável x para a linha inteira. Essas variáveis são usadas em iterações posteriores. Esses valores também são índices em dois arrays b e c , onde armazenamos os valores de contagem.
  • else{b[x]++;if(y==$1){c[x]++}} : se for uma linha com apenas uma coluna, incrementamos o valor na matriz b . E se essa coluna corresponder à segunda coluna na linha principal, que salvamos em y , também incrementaremos esse valor.
  • END{for (n in a){z=a[n];print z" "b[z]" "c[z]}} : No final, percorremos a matriz a e imprimimos seus valores (que é um simples despejo do conteúdo dos arquivos). Também imprimimos os valores contados nos outros dois arrays b e c .

A saída dá:

C1  NC01 2 2
    NC01
C2  NC01 3 2
    NC01
    NC02
C3  NC01 3 1
    NC02
    NC03
    
por 15.05.2015 / 08:33