Ordinare i dati in ordine decrescente della prima colonna, per valori uguali, utilizzare la seconda colonna in ordine crescente


22

Mi permetta di chiarire:

Supponiamo di avere alcune parole chiave con la frequenza del loro utilizzo:

12 Hi
7  Hash
7  C++  
9  Superuser
17 Stackoverflow
9  LaTeX  
42 Life
9  Ubuntu

Quello che voglio è ordinare questi dati in base alla frequenza in ordine decrescente e se ci sono alcuni valori uguali, dovrebbe usare la seconda colonna in ordine crescente.

sort -n -r foo.txt

La prima parte ma poi la seconda colonna sono anche reversed:

42 Life
17 Stackoverflow
12 Hi
9  Ubuntu
9  Superuser
9  LaTeX  
7  Hash
7  C++

Come posso ottenere i seguenti risultati?

42 Life
17 Stackoverflow
12 Hi
9  LaTeX  
9  Superuser
9  Ubuntu
7  C++ 
7  Hash

Penso di dover usare l' -kargomento ma non riesco a capire come!

Voglio sapere come si può fare usando solo il sortcomando di bash. Tuttavia, se non è possibile farlo solo con sort, altri comandi dovrebbero essere compatibili con la shell Bourne.


[Abbastanza OT]: sebbene equivalente per questo particolare dato, usare l' -gopzione di ordinamento GNU (numerico generale) invece che -nper i confronti numerici è più sicuro: funziona correttamente sia in virgola mobile che in numeri interi.
arielf

Risposte:


32

Specificare le chiavi di ordinamento separatamente con i criteri:

sort -k1,1nr -k2,2 inputfile

Questo specifica che la prima chiave viene ordinata numericamente in ordine inverso mentre la seconda viene ordinata secondo l' ordine di ordinamento predefinito .

Citando dall'ordinamento POSIX :

-k keydef

L' argomento keydef è una definizione del campo chiave di ordinamento limitato. Il formato di questa definizione è:

field_start [ type ] [ , field_end [ type ]]

dove field_start e field_end definiscono un campo chiave limitato a una parte della riga (vedere la sezione DESCRIZIONE ESTESA) e type è un modificatore dall'elenco dei caratteri 'b', 'd', 'f', 'i', ' n ',' r '. Il modificatore "b" si comporta come l' -bopzione, ma si applica solo al field_start o field_end a cui è associato. Gli altri modificatori devono comportarsi come le opzioni corrispondenti, ma si applicano solo al campo chiave a cui sono collegati; avranno questo effetto se specificato con field_start , field_end o entrambi., nessuna opzione si applica a nessuno dei due. Le implementazioni devono supportare almeno nove occorrenze -kdell'opzione, che devono essere significative nell'ordine della riga di comando. Se non -kviene specificata alcuna opzione, deve essere utilizzata una chiave di ordinamento predefinita dell'intera riga.

Quando sono presenti più campi chiave, le chiavi successive devono essere confrontate solo dopo che tutte le chiavi precedenti sono uguali. Tranne quando la -usi specifica opzione, linee che altrimenti risultano uguali devono essere ordinati come se nessuna delle opzioni -d, -f, -i, -n, o -kerano presenti (ma con -r ancora in vigore, se è stato specificato) e con tutti i byte nelle linee significative per la confronto. L'ordine in cui vengono scritte le righe che ancora confrontano uguali non è specificato.

Ciò produrrebbe:

42 Life
17 Stackoverflow
12 Hi
9  LaTeX
9  Superuser
9  Ubuntu
7  C++
7  Hash

Grazie. Ha fatto il trucco. Devo aspettare 10 minuti per accettare!
Pouya,

@StephaneChazelas Grazie per averlo sottolineato; aggiornato il riferimento.
Devnull
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.