Extrai o número exato de elementos do mesmo identificador

2

Eu tenho um arquivo assim:

Id       Chr     Start   End    
Prom_1   chr1    3978952 3978953  
Prom_1   chr1    3979165 3979166  
Prom_1   chr1    3979192 3979193  
Prom_2   chr1    4379047 4379048  
Prom_2   chr1    4379091 4379092  
Prom_2   chr1    4379345 4379346  
Prom_2   chr1    4379621 4379622  
Prom_3   chr1    5184469 5184470  
Prom_3   chr1    5184495 5184496  

e gostaria de contar quantas vezes o mesmo identificador aparece. Algo como:

Prom_1  3  
Prom_2  4  
Prom_3  2  

Qualquer ideia é realmente apreciada.

    
por fusion.slope 21.12.2016 / 10:33

5 respostas

1

Você pode usar o awk

awk 'NR>1 {a[$1]++} END { for (x in a) { print x,a[x] } } ' file

O NR>1 irá ignorar o cabeçalho.% a[$1]++ é um iterador de hash

    
por 21.12.2016 / 10:41
4

Com o datamash do GNU

$ datamash -W --header-in groupby 1 count 2 < file
Prom_1  3
Prom_2  4
Prom_3  2
    
por 21.12.2016 / 12:10
2

Você pode contar os identificadores com uniq :

tail -n +2 input | cut -d' ' -f1 | sort | uniq -c

Observe que uniq espera entrada classificada. Usamos tail para pular o cabeçalho e cut para "recortar" a primeira coluna.

Exemplo de saída:

  3 Prom_1
  4 Prom_2
  2 Prom_3

Caso um ID com um número menor seja impresso antes de um ID com um número maior (por exemplo, Prom_3 before Prom_10 ), você pode substituir sort por sort -V (classificação de versão):

tail -n +2 input2 | cut -d' ' -f1 | sort -V | uniq -c

Exemplo de saída (input2 contém uma linha extra para id Prom_10 ):

  3 Prom_1
  4 Prom_2
  2 Prom_3
  1 Prom_10
    
por 21.12.2016 / 10:40
0

Maneira simples com cat, cut, sort e uniq é:

sed -n '1,$p' input | cut -d' ' -f1 | sort | uniq -c
    
por 21.12.2016 / 10:46
0

Algo semelhante ao user3589054:

desde que há um monte de Id, quando você classifica você não terá a mesma ordem de Id porque, por exemplo, o Id começando com Prom_1 Prom_10 etc. será o primeiro. Então, o que eu fiz foi isso e funcionou bem:

awk 'NR>1 {a[$1]++} END { for (x in a) { print x,a[x] } } ' file | awk -F "_" '{print $1"\t"$2"\t"}' | cut -f 2 | sort -n | awk -F " " '{print $1"\t"$2}' | sed 's/^/Prom_/' > file.output.txt

onde:
awk 'NR>1 {a[$1]++} END { for (x in a) { print x,a[x] } } ' file |
você terá a saída com o ID e o número, mas não será classificado

awk -F "_" '{print $1"\t"$2"\t"}' | você dividirá o arquivo em Prom, número, seu número de identificação e sua quantidade

cut -f 2 | sort -n |
ordenar de acordo com o número de identificação e seu valor correspondente

awk -F " " '{print $1"\t"$2}' |
aqui você tabula as duas colunas

sed 's/^/Prom_/'
e, finalmente, você anexar o Prom_ na frente do seu número de identificação

    
por 21.12.2016 / 13:56