Come ordinare numericamente per ultima colonna?


23

Ho questo input:

sdkxyosl 1
safkls 2
asdf--asdfasxy_asd 5
dkd8k  jasd 29
sdi44sw 43
asasd afsdfs 10
rklyasd 4

Ho bisogno di questo risultato:

sdi44sw 43
dkd8k  jasd 29
asasd afsdfs 10
asdf--asdfasxy_asd 5
rklyasd 4
safkls 2
sdkxyosl 1

Quindi ho bisogno di ordinare le linee in base all'ultima colonna.

Non so quante colonne ci siano in una riga.

Non riesco proprio a capirlo, come farlo. Non ho "poteri perl". Ho solo ~ poteri di scripting medi con sed, awk, cut, ecc.

Qualcuno sa come farlo?

Risposte:


34

La seguente riga di comando utilizza awkper anteporre l'ultimo campo di ogni riga di file.txt, esegue un ordinamento numerico inverso, quindi utilizza cutper rimuovere il campo aggiunto:

awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '

omg ... non sapevo di $ RS !! Grazie mille!!!!!
LanceBaynes,

@forcefsck: non credo sia possibile solo con sort -k. La begfieldfunzione nell'ordinamento GNU conta solo fino a zero. Il tuo approccio decorate-sort-undecorate (DSU) sembra essere il modo migliore secondo me.
Mikel,

Per interesse, perché $NF,$RSe no $NF,$0? Non lo sapevo $RS. (Immagino che sia equivalente a $NF,$"\n", il che fa lo stesso, ma penso anche che sia sorprendente.)
Mikel

2
@ johnny8888, @forcefsck: in awk, $può essere seguito da qualsiasi espressione. " L'effetto dell'espressione del numero di campo che valuta qualcosa di diverso da un numero intero non negativo non è specificato ". GNU awk (sul mio sistema) considera una stringa come "\n"zero. Altri (ad esempio l'implementazione originale di A, W e K) si interrompono con un messaggio di errore. Se RSfosse una cifra, otterrai il campo corrispondente su qualsiasi implementazione. Quindi non farlo, usa $0.
Gilles 'SO- smetti di essere malvagio' il

1
Davvero pulito! Quindi la lunga spiegazione di ciò che sta succedendo: con awk, stampa prima l'ultimo campo quindi l'intero record, ordina in ordine numerico inverso, quindi taglia la prima colonna usando il taglio.
Phyatt,
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.