Ich habe ein paar Befehle in einem awk-Skript, das ich schreibe:
print "Here are some players and their numbers, sorted by last name"
if(sum[x] > 500) {print x, $2}
Welche Ausgänge:
Here are some players and their numbers, sorted by last name
Lebron James 23
Kevin Durant 35
Kobe Bryant 24
Blake Griffin 32
Dikembe Mutumbo 55
Wie kann ich den sort
Befehl in meinem awk-Skript verwenden , um NUR die Spieler und ihre Nummern zu sortieren?
command-line
text-processing
awk
KM142646
quelle
quelle
x
, und dannPROCINFO["sorted_in"]
auf einen kryptischen Wert setzen. Geben Sie dann das Array aus. Ich würde nicht dorthin gehen.... | sort -k2,2
....| sort -k2,2
wenn andere Zeilen gedruckt werden müssen? Überprüfen Sie die bearbeitete Frage.echo
-ing aus der Schale die Kopfzeile, führt dann dieawk | sort
Pipeline.Antworten:
Sie können
| sort -k2
Ihrem Befehl hinzufügen . Dies wird alphabetisch nach der zweiten Spalte sortiert.Beispiel:
führt zu
quelle
{print x, $2}
direkt im Skriptcode zu sortieren ? Beim Verrohren wird ein Fehler angezeigtif(sum[x] > 500) {print x, $2} | sort -k2
.if(sum[x] > 500) {print x, $2}
ist Awk-Code, während| sort -k2
es sich um einen Shell-Befehl handelt. Offensichtlich kann man die beiden nicht so mischen, weil sie verschiedene Sprachen sind. Stattdessen müssen Sie densort
Befehl auf die Ausgabe des Awk-Interpreters anwenden, auf dem Ihr Awk-Code-Snippet ausgeführt wird. Wenn Sie nicht wissen, was ich meine, erweitern Sie bitte Ihre Frage, um uns das vollständige Bild zu geben../my-script.sh | sort -k2
. 2. füge `| hinzu sortiere -k2` in die Zeile deines Skripts, die die in deiner Frage angegebene Ausgabe erzeugt.Obwohl ich es nicht empfehlen würde (angesichts der relativ einfachen Weiterleitung des Ergebnisses über einen externen
sort
Befehl), können Sie dies zumindest mit neueren Versionen von GNU awk (mindestens 4.0 IIRC) tun, wie unter Sortieren von Array-Werten und -Indizes mit gawk beschriebenSo können Sie es implementieren, vorausgesetzt, Sie haben die Daten in einem assoziativen Array, in dem sich der Index befindet
Firstname Lastname
. Zuerst müssen Sie eine benutzerdefinierte Vergleichsfunktion definieren, die den Index aufteilt, zuerst vergleicht undLastname
dann (als Tie Breaker)Firstname
zJetzt können Sie die
PROCINFO["sorted_in"]
in den Kommentaren von @zwets erwähnte Array-Sortiermethode verwendenEtwas zusammensetzen
Testen:
In kleineren oder älteren Versionen von awk ist es möglicherweise am besten, die von indizierten Daten zu speichern,
Lastname Firstname
stattdessen mit den herkömmlichen zu sortierenasorti
und dann die Felder der Indizes zu teilen und auszutauschen, während Sie das Array durchlaufen, um es zu drucken:quelle
Um
sort
nur durch das Leerzeichen getrennt zweite Feld Taste-k2,2
:Standardmäßig
sort
erfolgt die Sortierung lexikografisch.Beachten Sie, dass
-k2
Sie möglicherweise nicht das gewünschte Ergebnis erhalten , wenn Sie das letzte Feld für den Sortierschlüssel nicht erwähnen, dh wenn Sie nur das Feld verwenden, da diessort
für alle Felder ab der zweiten gilt.Überprüfen Sie auch
man sort
.quelle
Versuchen
Wobei myscript.awk rein awk-Befehle enthält.
Wenn Ihr eigentliches Skript ein Shell-Skript ist, haben Sie mehrere Möglichkeiten, einschließlich
./myscript.bash | sort -k2
Rewrite - Code als Funktion im Skript
statt
Tun
Beachten Sie jedoch, dass Sie die Sortierung auch auf die do ... done-Struktur anwenden können, anstatt eine Funktion zu erstellen.
quelle
So sortieren Sie Ihre zu druckenden Daten:
Angenommen, Sie möchten das zweite Feld (durch Leerzeichen getrennt) drucken. Verwenden Sie Folgendes:
z.B:
Wenn Sie das gesamte drucken möchten,
data.txt
aber in Spalte 2 sortiert sind, dann:Verwenden Sie diese Logik (en) in Ihrer Anforderung.
Sie können
man sort
für interessantere Funktionen von verwendensort
.quelle
Was ist mit unten:
es funktioniert, wenn ich getestet habe.
quelle
So sortieren Sie die Ausgabe in eine Datei:
quelle