Comment trier numériquement par dernière colonne?

23

J'ai cette entrée:

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

J'ai besoin de cette sortie:

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

J'ai donc besoin de trier les lignes par la dernière colonne.

Je ne sais pas combien de colonnes sont sur une ligne.

Je n'arrive pas à comprendre comment le faire. Je n'ai pas de "pouvoirs perl". J'ai juste ~ des pouvoirs de script moyens avec sed, awk, cut, etc.

Quelqu'un sait-il comment le faire?

LanceBaynes
la source

Réponses:

34

La ligne de commande suivante utilise awkpour ajouter le dernier champ de chaque ligne de file.txt, effectue un tri numérique inverse, puis utilise cutpour supprimer le champ ajouté:

awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '
forcefsck
la source
omg ... je ne connaissais pas le $ RS !! Merci beaucoup!!!!!
LanceBaynes
@forcefsck: Je ne pense pas que ce soit possible avec seulement sort -k. La begfieldfonction de tri GNU compte à rebours jusqu'à zéro. Votre approche décorer-trier-décorer (DSU) semble être la meilleure façon, je pense.
Mikel
Par intérêt, pourquoi $NF,$RSet non $NF,$0? Je ne savais pas $RSça. (Je suppose que c'est équivalent à $NF,$"\n", ce qui fait la même chose, mais c'est aussi surprenant je pense.)
Mikel
2
@ johnny8888, @forcefsck: Dans awk, $peut être suivi de n'importe quelle expression. " L'effet de l'expression du numéro de champ évaluant autre chose qu'un entier non négatif n'est pas spécifié ". GNU awk (sur mon système) traite une chaîne comme "\n"zéro. D'autres (par exemple l'implémentation d'origine par A, W et K) s'interrompent avec un message d'erreur. S'il RSs'avérait être un chiffre, vous obtiendriez le champ correspondant sur n'importe quelle implémentation. Alors ne faites pas ça, utilisez $0.
Gilles 'SO- arrête d'être méchant'
1
Vraiment bien! Donc, la longue explication de ce qui se passe: avec awk, imprimez d'abord le dernier champ puis l'ensemble de l'enregistrement, triez en sens inverse numériquement, puis coupez la première colonne en utilisant cut.
phyatt du