Contagem de ocorrências na primeira coluna de um arquivo

8

Temos este arquivo:

1 2 
1 3
1 2
3 3
52 1
52 300

e mais 1000.

Eu quero contar o número de vezes que cada valor ocorre na primeira coluna.

1  3 
3  1
52 2

Isso significa que vimos 1 três vezes.

Como posso fazer isso em Perl, AWK ou Bash?

    
por Arash 20.12.2012 / 08:10

1 resposta

12

Se a entrada estiver classificada, você pode usar o uniq:

<infile cut -d' ' -f1 | uniq -c

Se não, classifique primeiro:

<infile cut -d' ' -f1 | sort -n | uniq -c

Saída:

  3 1                                      
  1 3
  2 52

A saída é trocada em comparação com sua exigência, você pode usar awk '{ print $2, $1 }' para alterar isso.

1 3 
3 1
52 2

Há também o idioma do awk, que não requer entrada classificada:

awk '{h[$1]++}; END { for(k in h) print k, h[k] }'

Saída:

1 3
52 2
3 1

Como a saída aqui vem de um hash, ela não será ordenada, passe para sort -n se isso for necessário:

awk '{h[$1]++} END { for(k in h) print k, h[k] }' | sort -n

Se você está usando o GNU awk, você pode fazer a classificação dentro do awk:

awk '{h[$1]++} END { n = asorti(h, d, "@ind_num_asc"); for(i=1; i<=n; i++) print d[i], h[d[i]] }'

Nos dois últimos casos, a saída é:

1 3
3 1
52 2
    
por 20.12.2012 / 08:14