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.