Wie wird nach letzter Spalte numerisch sortiert?

23

Ich habe diese Eingabe:

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

Ich brauche diese Ausgabe:

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

Also muss ich die Zeilen nach der letzten Spalte sortieren.

Ich weiß nicht, wie viele Spalten sich in einer Zeile befinden.

Ich kann es einfach nicht herausfinden, wie es geht. Ich habe keine "Perl-Kräfte". Ich habe gerade ~ durchschnittliche Skriptfähigkeiten mit sed, awk, cut, etc ..

Weiß jemand, wie es geht?

LanceBaynes
quelle

Antworten:

34

In der folgenden Befehlszeile wird awkdas letzte Feld jeder Zeile von file.txt vorangestellt, eine umgekehrte numerische Sortierung durchgeführt und anschließend cutdas hinzugefügte Feld entfernt:

awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '
forcefsck
quelle
omg ... ich wusste nichts über die $ RS !! vielen Dank!!!!!
LanceBaynes
@forcefsck: Ich denke nicht, dass es nur mit möglich ist sort -k. Die begfieldFunktion in der GNU-Sortierung zählt nur bis auf Null herunter. Ihr Ansatz zum Dekorieren, Sortieren und Undekorieren (DSU) scheint der beste Weg zu sein, wie ich finde.
Mikel
Aus Interesse, warum $NF,$RSund nicht $NF,$0? Das wusste ich $RSnicht. (Ich denke, es ist äquivalent zu $NF,$"\n", was dasselbe tut, aber das ist auch überraschend, denke ich.)
Mikel
2
@ johnny8888, @forcefsck: In awk $kann auf jeden Ausdruck gefolgt werden. " Die Auswirkung des Feldnummernausdrucks, der eine andere als eine nicht negative Ganzzahl ergibt, ist nicht angegeben. " GNU awk (auf meinem System) behandelt einen String "\n"als Null. Andere (zB die ursprüngliche Implementierung von A, W und K) brechen mit einer Fehlermeldung ab. Wenn es sich RSzufällig um eine Ziffer handelt, erhalten Sie bei jeder Implementierung das entsprechende Feld. Also mach das nicht, benutze $0.
Gilles 'SO- hör auf böse zu sein'
1
Wirklich ordentlich! Also die lange Erklärung, was los ist: Mit awk zuerst das letzte Feld und dann den gesamten Datensatz drucken, in umgekehrter Reihenfolge numerisch sortieren und dann die erste Spalte mit cut abschneiden.
Phyatt