Mit awk und sort zum Sortieren einer Tabelle nach ID-Feld
Lerne ich Unix -, und ich möchte Sortieren Sie die Tabelle:
Name:Alice,ID:2368,Hometown:columbus,bithday:03/11/1988
Name:Ted,ID:2368,Hometown:Portland,bithday:06-11-1992
Name:Mark,ID:2218,Hometown:Palo Alto,bithday:04-23-1984
Name:Xiao,ID:2571,hometown:Carson,bithday:07/06/1975
Name:Rain,ID:0264,hometown:little stone,bithday:11-09-1982
Name:Susan,ID:1261,Hometown:Menlo park,bithday:12-13-1989
Name:Zack,ID:1594,Hometown:columbus,bithday:02-04-1984
Und haben es wie folgt formatiert:
Rain,0264,little stone,11-09-1982
Susan,1261,Menlo park,12-13-1989
Zack,1594,columbus,02-04-1984
Mark,2218,Palo Alto,04-23-1984
Alice,2368,columbus,03-11-1988
Ted,2368,Portland,06-11-1992
Xiao,2571,Carson,07-06-1975
Ich will heraus zu filtern und den Schlüssel in der Schlüssel-Wert-Paaren (Schlüssel:Wert) und dann Sortieren nach ID mit Verwendung von awk und sort.
Welche Befehle ich dazu verwenden?
- Sie noch nicht hob eine Antwort, so die Antworten, die gestellt wurden sind natürlich nicht für Sie arbeiten. Können Sie beschreiben, was noch nicht abgedeckt waren?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seine so einfach:
getestet unter:
Nun die Ausführung:
-t
argument für die Art, die ich nicht kannte 🙂Dieser brauchte eine Weile, um herauszufinden, bis ich schließlich sah, dass "Geburtstag" wurde falsch geschrieben in Ihrem input-Daten.
Könnten Sie gehen zu whole-hog mit diesem und analysieren Sie die Daten als aktuelle Daten:
Diese durchläuft jede Zeile bricht die Felder durch ein Komma, speichert die Schlüssel=Wert-Kombinationen in einem array, passt Ihr "bithday" - format und druckt. (Beachten Sie, dass ich abgeholt habe, ein sinnvoller Datumsformat für Sie.)
Aber es könnte einfacher sein, zu tun, einige einfache Mustererkennung:
Dieser liefert die gleichen Ergebnisse, aber mit weniger code. Wenn Sie brauchen, um mehr tun, interessante Dinge mit Ihren input-Daten, dann natürlich, awk ist der Weg zu gehen.
Oh, und meine
sed
kommt von FreeBSD, so dass es verwendet die-E
option, um ERE. Wenn Sie mit Linux oder einem anderen Anbieter von GNU sed ist, können Sie wahrscheinlich ersetzen die-E
mit-r
.Mithilfe von grep um den Wert zu finden, fügen, Zusammenbau der Leitungen, und natürlich Art:
Vorausgesetzt, dass kein Komma in den Werten.
Der einfachste Weg, die ich gefunden habe, ist die Verwendung
awk
formatieren Sie die Ausgabe ein, und fügen Sie eine neue Spalte, diesort
verwenden, und verwenden Sieawk
wieder ausblenden dieser Spalte.Den
-F
ist die Angabe der Trennzeichen (hier,
). Wir wollen dann löschen Sie den Namen der Spalte (dh alle Buchstaben, gefolgt von:
), und schließlich Anzeige der ID-Spalte, und das ganze umgeschrieben Linie.Wir verwenden dann
sort
, die standardmäßig davon ausgegangen, dass die Sortierung der Schlüssel der ersten Spalte, dieawk
wieder nur der zweite Teil jeder Zeile.Bearbeiten: da die Räume in den Städten, es war ein Ausgabe-Problem mit awk. Der Einfachheit halber habe ich nur neu zugewiesen, die erste variable (das ist die Spalte, die ausgeblendet werden sollen) und drucken Sie die gesamte Zeile.
Hier ist ein Weg, mit
GNU awk
:Ergebnisse:
Muss es sein, awk? Wenn nicht:
Vim
zu entfernen-Taste strings mit:%s/[a-z]*://gi
sort -t , -k 2 file
Wenn AWK ist ein muss, dann würde ich denken, der diese zu Sortieren (OHNE Tasten - aber die Antwort @Aif gab ist schön.
EDIT: verbessert, Dank @Aif regex und durch @Ghoti ' s Kommentar. Jetzt Vim-Befehls-substitution, verwendet die regex-und-key-Fall-und text - 'spielt keine Rolle', wie Meister Yoda sagen würde.
:set ic
zu IgnoreCase. Und (2) das ist in Ordnung für ein one-off, aber kann man nicht automatisieren vim-Befehle leicht. Schließlich (3) Ihre "Sortieren mit awk" - link ist eigentlich für GAWK, nicht awk. Wenn die OP nicht erwähnt, seine Plattform, eine gute Antwort wird sein, nicht-konfessionelle und Arbeit überall, nicht nur auf IHRER Lieblings-Plattform.asorti()
zu sein bemerkenswert für diesen Fall - ganz besonders, weil Awk Antwort bereits vorhanden war - etwas falsch mit ihm?Nur die FS und OFS zu dem, was Sie in Ihrem Kopf, drucken Sie die Felder, die Sie möchten, und Sortieren:
Nachdem Sie es formatiert haben als benötigt (ich verstehe, dass Sie haben), können Sie Sortieren nach der zweiten Spalte durch das Weiterreichen der Daten zu
sort -t, -k2
.Wenn Sie eigentlich noch nicht, ich denke, eine der einfachsten Möglichkeiten wäre
sed 's/[[:alnum:]]*://g'
.So wird der gesamte Befehl wäre
Katze temp.txt | awk -F"|:" '{print $2","$4","$6}' | sort-t, -k2n
awk ... temp.txt
funktioniert genauso gut und spart (möglicherweise Abwürgen) des Rohres.