Freqüência Listada de Diferentes Strings em uma Coluna Particular

2

Eu preciso descobrir quantas vezes uma determinada string aparece na coluna 4.

Estes são meus dados:

25 48656721 48656734 FAM132B ENSCAFT00000019683 4 0.51 
X 53969937 53969950 FAM155B ENSCAFT00000026508 5 0.57 
3 42203721 42203906 FAM169B ENSCAFT00000017307 5 0.54 
36 28947780 28947831 FAM171B ENSCAFT00000046981 5 0.51 
10 45080519 45080773 FAM171B ENSCAFT00000003744 9 -0.53 
3 61627122 61627446 FAM193A ENSCAFT00000023571 13 0.64 
3 61626373 61626466 FAM193A ENSCAFT00000023571 6 0.51 
15 55348822 55349196 FAM193A ENSCAFT00000045012 5 0.52 

Esta é uma parte dos meus dados. Então, eu quero que a saída seja:

1 FAM132B
1 FAM155B
1 FAM169B
2 FAM171B
3 FAM193A

E assim por diante - para o resto dos meus dados. O que é um comando que funcionaria?

    
por Justin 23.09.2015 / 19:47

3 respostas

2

Uma solução simplista seria usar awk para puxar a coluna 4; uniq -c para contá-los; e outro sort para colocá-los em ordem na segunda coluna (os dados antigos da coluna 4):

awk '{print $4}' < data | uniq -c | sort -k2

Em sua entrada de amostra (atualizada), isso fornece:

  1 FAM132B
  1 FAM155B
  1 FAM169B
  2 FAM171B
  3 FAM193A
    
por 23.09.2015 / 20:22
1

Use awk :

awk '{a[$4]++} END{for(s in a){print a[s]" "s}}' file
  • a[$4]++ incrementa o elemento da matriz cujo índice tem o nome da quarta coluna. Ao finalizar o arquivo, esse array contém contadores de todas as ocorrências da quarta coluna.
  • END{} : indica um bloco de código que é executado quando o awk está no arquivo.
    • for(s in a) é executado pela matriz ...
    • print a[s]" "s} ... e imprima seus valores e índices.

A saída:

1 FAM169B
3 FAM193A
1 FAM132B
1 FAM155B
2 FAM171B
    
por 23.09.2015 / 20:15
0

Supondo que o delimitador é um espaço único:

cut -d' ' -f4 infile | sort | uniq -c

Observe que uniq filtra as linhas de correspondência adjacentes , portanto você precisa sort primeiro, por exemplo, com esta entrada:

FAM193A
FAM155B
FAM169B
FAM171B
FAM132B
FAM193A
FAM132A
FAM132B
FAM155B
FAM169B
FAM171B
FAM171A
FAM193A
FAM132A

usando sort | uniq -c produz:

  2 FAM132A
  2 FAM132B
  2 FAM155B
  2 FAM169B
  1 FAM171A
  2 FAM171B
  3 FAM193A

enquanto uniq -c | sort -k2 produz:

  1 FAM132A
  1 FAM132A
  1 FAM132B
  1 FAM132B
  1 FAM155B
  1 FAM155B
  1 FAM169B
  1 FAM169B
  1 FAM171A
  1 FAM171B
  1 FAM171B
  1 FAM193A
  1 FAM193A
  1 FAM193A
    
por 23.09.2015 / 20:55