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
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.
Com o datamash do GNU
$ datamash -W --header-in groupby 1 count 2 < file
Prom_1 3
Prom_2 4
Prom_3 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
Maneira simples com cat, cut, sort e uniq é:
sed -n '1,$p' input | cut -d' ' -f1 | sort | uniq -c
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