2010-05-06 10 views
5

Tengo un archivo delimitado por tabulaciones con 5 columnas y necesito recuperar un conteo de solo el número de líneas únicas de la columna 2. Normalmente haría esto con Perl/Python pero estoy obligado a usar el caparazón para este.Contando valores únicos en una columna con un script de shell

He utilizado con éxito en el pasado la función * nix uniq conectada al wc, pero parece que voy a tener que usar awk aquí.

Cualquier consejo sería muy apreciado. (He hecho una pregunta similar anteriormente sobre las comprobaciones de columna usando awk, pero esto es un poco diferente y quería separarlo así que si alguien en el futuro tiene esta pregunta, esta será aquí)

¡Muchas gracias!
Lilly

Respuesta

16

No necesita utilizar awk.

$ cut -f2 file.txt | sort | uniq | wc -l 

debería hacerlo.

Esto usa el hecho de que la pestaña es el separador de campo predeterminado de cut, por lo que obtendremos solo el contenido de la columna dos de esta manera. Luego, un pase a través de sort funciona como una etapa previa al uniq, que elimina los duplicados. Finalmente contamos las líneas, que es el número buscado.

+1

Esto es genial. Después de perder el tiempo, descubrí que puedo encontrar a los incautos con este archivo de gato .txt | awk '{print $ 2}' | ordenar | uniq -c | ordenar -n –

5

voy por

$ cut -f2 file.txt | sort -u | wc -l 

Al menos en algunas versiones, uniq se basa en los datos de entrada están ordenados (se ve solamente en líneas adyacentes).

Por ejemplo en el Solaris docs:

utilidad

El uniq leerá un archivo de entrada la comparación de las líneas adyacentes, y de escritura una copia de cada línea de entrada en la salida. La segunda y siguientes copias de líneas de entrada adyacentes repetidas no se escribirán.

Las líneas repetitivas en la entrada no se detectarán si no son adyacentes a .

0
awk '{if($0~/Not Running/)a++;else if($0~/Running/)b++}END{print a,b}' temp 
Cuestiones relacionadas