2010-08-18 24 views
13

He estado tratando de obtener los valores únicos en cada columna de un archivo delimitado por tabulaciones en bash. Entonces, utilicé el siguiente comando.Ordenando en bash

cut -f <column_number> <filename> | sort | uniq -c 

Trabaja muy bien y que puedo conseguir los valores únicos en una columna y su recuento como

105 Linux 
55 MacOS 
500 Windows 

Lo que quiero hacer es en lugar de la clasificación por los nombres de los valores de columna (que en este ejemplo son nombres de sistema operativo) Quiero ordenarlos por conteo y posiblemente tenga el conteo en la segunda columna en este formato de salida. Entonces tendrá que verse como:

Windows 500 
MacOS 105 
Linux 55 

¿Cómo puedo hacer esto?

Respuesta

14

Uso:

cut -f <col_num> <filename> 
    | sort 
    | uniq -c 
    | sort -r -k1 -n 
    | awk '{print $2" "$1}' 

Los sort -r -k1 -n tipo en el orden inverso, utilizando el primer campo como un valor numérico. El awk simplemente invierte el orden de las columnas. Puede probar los comandos de la tubería añadido de este modo (con el formato más agradable):

pax> echo '105 Linux 
55 MacOS 
500 Windows' | sort -r -k1 -n | awk '{printf "%-10s %5d\n",$2,$1}' 
Windows  500 
Linux  105 
MacOS   55 
+3

que suele hacer 'Ordenar -k1,1' para ordenar sólo por el campo especificado, por lo demás líneas están ordenados por todos los campos del campo 1 al final de la línea. – Hasturkun

2

Mina:

cut -f <column_number> <filename> | sort | uniq -c | awk '{ print $2" "$1}' | sort 

Esto alterará el orden de las columnas (awk) y luego simplemente ordenar la salida.

Hope esto le ayudará a

+1

Eso ordena por nombre en lugar de contar. –

+0

Claro, de la pregunta sfactor: "Lo que quiero hacer es en lugar de ordenar por los nombres de valores de la columna" – sourcerebels