2010-08-18 11 views
13

Ho cercato di ottenere i valori univoci in ogni colonna di un file delimitato da tabulazioni in bash. Quindi, ho usato il seguente comando.Ordinamento in bash

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

Funziona benissimo e posso ottenere i valori unici in una colonna e il suo numero di Mi piace

105 Linux 
55 MacOS 
500 Windows 

Quello che voglio fare è invece di ordinamento per i nomi dei valori della colonna (che in questo esempio sono nomi OS) Voglio ordinarli per conteggio e possibilmente avere il conteggio nella seconda colonna in questo formato di output. Quindi dovrà essere simile a:

Windows 500 
MacOS 105 
Linux 55 

Come faccio?

risposta

14

Uso:

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

I sort -r -k1 -n sorta in ordine inverso, utilizzando il primo campo come valore numerico. Lo awk inverte semplicemente l'ordine delle colonne. È possibile verificare i comandi della pipeline aggiunto in tal modo (con la formattazione più bello):

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

faccio di solito 'sorta -k1,1' per ordinare solo dal campo specificato, altrimenti le linee sono ordinati per tutti i campi da campo 1 alla fine della linea. – Hasturkun

2

Mine:

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

Ciò modificherà l'ordine delle colonne (awk) e poi basta ordinare l'output.

Spero che questo vi aiuterà a

+1

Questo ordina per nome invece che per conteggio. –

+0

Certo, dalla domanda Sffactor: "Quello che voglio fare è invece di ordinare i nomi dei valori delle colonne" – sourcerebels