Contando ocorrências na primeira coluna de um arquivo

9

Temos este arquivo:

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

e mais 1000.

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

1  3 
3  1
52 2

Isso significa que vimos 1três vezes.

Como posso fazer isso em Perl, AWK ou Bash?

Arash
fonte
3
Oi arashams! Vi recentemente que você fez perguntas muito semelhantes, que giram em torno do mesmo tópico. Tenho certeza de que a comunidade gostaria de ajudá-lo, mas talvez você possa nos mostrar o que já tentou e onde exatamente ficou preso? Exigimos que as pessoas mostrem um pouco de esforço antes de fazer suas perguntas - não há aprendizado envolvido em simplesmente pedir que outras pessoas forneçam o código para uma coisa específica. Por que não nos dizer qual é exatamente o pano de fundo disso? Talvez exista uma maneira mais fácil de realizar o que você deseja, e não precisamos recorrer a exemplos fictícios com alguns números abstratos?
slhck
tnx por sua ajuda. Estou trabalhando com dados do bgpdump e analisando-os.
Arash20:

Respostas:

12

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

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

Caso contrário, classifique-o primeiro:

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

Resultado:

  3 1                                      
  1 3
  2 52

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

1 3 
3 1
52 2

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

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

Resultado:

1 3
52 2
3 1

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

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

Se você estiver usando o GNU awk, poderá fazer a classificação no 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
Thor
fonte
tnx .its funcionou :)
Arash
você poderia explicar o código ??? awk '{h [$ 1] ++} END {para (k em h) imprima k, h [k]}' | sort -n
Arash
3
@arashams: o {h[$1]++}bloco é avaliado para cada linha. hé um hash e $1é a primeira coluna e usada como a chave para h. Portanto, isso calcula a frequência com que os únicos $1são vistos. O ENDbloco é executado no final da entrada e imprime as chaves e as notas. sort -nclassifica a saída numericamente.
Thor