Contando ocurrencias en la primera columna de un archivo

9

Tenemos este archivo:

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

y 1000 más.

Quiero contar la cantidad de veces que ocurre cada valor en la primera columna.

1  3 
3  1
52 2

Esto significa que vimos 1tres veces.

¿Cómo puedo hacer eso, en Perl, AWK o Bash?

Arash
fuente
3
Hola arashams Hace poco te vi hacer preguntas muy similares que giran en torno al mismo tema. Estoy seguro de que a la comunidad le gustaría ayudarlo, pero ¿tal vez podría mostrarnos lo que ya ha intentado y dónde se atascó exactamente? Exigimos que las personas muestren un poco de esfuerzo antes de hacer sus preguntas: no hay ningún aprendizaje involucrado simplemente pidiendo a otros que le den el código para algo específico. ¿Por qué no nos dices cuál es exactamente el trasfondo de esto? ¿Quizás haya una manera más fácil de lograr lo que desea, y no necesitamos recurrir a ejemplos ficticios con algunos números abstractos?
slhck
TNX por su ayuda. Estoy trabajando con datos de bgpdump y analizándolos.
Arash

Respuestas:

12

Si la entrada está ordenada, puede usar uniq:

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

Si no, ordénelo primero:

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

Salida:

  3 1                                      
  1 3
  2 52

La salida se intercambia en comparación con sus requisitos, puede usar awk '{ print $2, $1 }'para cambiar eso.

1 3 
3 1
52 2

También está el idioma awk, que no requiere una entrada ordenada:

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

Salida:

1 3
52 2
3 1

Como la salida aquí proviene de un hash, no se ordenará, pase a sort -nsi es necesario:

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

Si está utilizando GNU awk, puede ordenar desde awk:

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

En los últimos dos casos, el resultado es:

1 3
3 1
52 2
Thor
fuente
tnx .its trabajado :)
Arash
¿podrías explicar el código? awk '{h [$ 1] ++} END {para (k en h) imprimir k, h [k]}' | ordenar -n
Arash
3
@arashams: el {h[$1]++}bloque se evalúa para cada línea. hes un hash y $1es la primera columna y se usa como clave para h. Entonces esto cuenta con qué frecuencia $1se ven los únicos . El ENDbloque se ejecuta al final de la entrada e imprime las claves y los recuentos. sort -nordena la salida numéricamente.
Thor