¿Cómo ordenar numéricamente por última columna?

23

Tengo esta entrada:

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

Necesito esta salida:

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

Entonces necesito ordenar las líneas por la última columna.

No sé cuántas columnas hay en una línea.

Simplemente no puedo entender cómo hacerlo. No tengo "poderes perl". Solo tengo ~ poderes de script promedio con sed, awk, cut, etc.

¿Alguien sabe cómo hacerlo?

LanceBaynes
fuente

Respuestas:

34

La siguiente línea de comando se usa awkpara anteponer el último campo de cada línea de file.txt, realiza una ordenación numérica inversa y luego se usa cutpara eliminar el campo agregado:

awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '
forcefsck
fuente
¡Dios mío ... no sabía sobre el $ RS! ¡¡¡¡¡muchas gracias!!!!!
LanceBaynes
@forcefsck: No creo que sea posible solo con sort -k. La begfieldfunción en GNU sort simplemente cuenta regresiva a cero. Su enfoque de decorar-ordenar-decorar (DSU) parece ser la mejor manera, creo.
Mikel
Fuera de interés, ¿por qué $NF,$RSy no $NF,$0? No sabía $RSque hiciera eso. (Supongo que es equivalente a $NF,$"\n", que hace lo mismo, pero eso también es sorprendente, creo).
Mikel
2
@ johnny8888, @forcefsck: en awk, $puede seguir cualquier expresión. " El efecto de la expresión de número de campo que se evalúa para cualquier cosa que no sea un entero no negativo no está especificado ". GNU awk (en mi sistema) trata una cadena "\n"como cero. Otros (por ejemplo, la implementación original de A, W y K) abortan con un mensaje de error. Si RSresulta ser un dígito, obtendría el campo correspondiente en cualquier implementación. Así que no hagas esto, úsalo $0.
Gilles 'SO- deja de ser malvado'
1
Realmente ordenado! Entonces, la larga explicación de lo que está sucediendo: con awk, imprime el último campo primero y luego el registro completo, ordena en reversa numéricamente, luego recorta la primera columna usando corte.
phyatt