echo -e 'one two three\nfour five six\nseven eight nine'
one two three
four five six
seven eight nine
Wie kann ich etwas "MAGIC" machen, um diese Ausgabe zu bekommen ?:
three
six
nine
UPDATE: Ich brauche es nicht auf diese Weise, ich brauche eine allgemeine Lösung, damit egal wie viele Spalten in einer Zeile sind, zB: awk zeigt immer die letzte Spalte an.
text-processing
awk
LanceBaynes
quelle
quelle
Antworten:
Es kann auch nur mit durchgeführt werden
'bash'
, ohne'sed'
,'awk'
oder'perl'
:quelle
... | while read -r line; do echo ${line##* }; done
bash
Der Array-Index wird arithmetisch ausgewertet. Diesecho ${line[nb - 1]}
ist ausreichend. Wie zu sprechenbash
, können Sie einfach die „nb“ Dinge überspringenecho ${line[-1]}
. Eine tragbare Alternative der später:echo ${line[@]: -1]}
. (Siehe Stephane Chazelas 'Kommentar zu negativen Indizes an anderer Stelle.)Versuchen:
quelle
ps -ef | awk '{ print $NF }'
einige Zeilen wurden abgeschnitten ...) Perl hat diese Einschränkung nicht. ( gnu.org/software/autoconf/manual/autoconf-2.67/html_node/… : "Traditionelles Awk hat ein Limit von 99 Feldern in einem Datensatz. Da einige Awk-Implementierungen, wie Tru64, die Eingabe auch dann aufteilen, wenn Sie nicht referenzieren Um dieses Problem zu umgehen, setzen Sie "FS" auf ein ungewöhnliches Zeichen und verwenden Sie "split". "awk
Implementierungen haben diese Einschränkung? Ich habe es nie gesehen. Meinmawk
Wille erstickt32768
aber meingawk
undigawk
kann mit Millionen glücklich umgehen. Sogar meine Busyboxawk
kann mit Millionen umgehen. Ich bin noch nie auf eineawk
gestoßen, die nicht mit 100 Feldern umgehen kann, das ist schließlich eine winzige Zahl. Sind Sie sicher, dass die Informationen immer noch relevant sind? Auch unter Solaris?Es ist einfacher als du denkst.
quelle
Versuchen Sie
grep
(kürzer / einfacher, aber 3x langsamer alsawk
aufgrund der Verwendung von Regex):Oder
ex
(noch langsamer, aber es druckt den gesamten Puffer nach Abschluss, was nützlicher ist, wenn er an Ort und Stelle sortiert oder bearbeitet werden muss):Ersetzen Sie
-sc'%p|q!'
durch , um die Position zu ändern-scwq
.Oder
bash
:Performance
Angesichts der generierten 1 GB-Datei über:
Ich habe die Parsing-Zeitstatistik durchgeführt (lief ~ 3x und nahm die niedrigste, getestet auf MBP OS X):
mit
awk
:mit
grep
:mit
perl
:mit
rev
+cut
:mit
ex
:mit
bash
:quelle
quelle
-a
:, Felder automatisch in ein@F
Array aufteilen ;-l
schneidet ab$/
(Trennzeichen für Eingabesätze) und speichert es unter$\
(Trennzeichen für Ausgabesätze). Da keine Oktalzahl angegeben ist-l
, wird das Original$/
gedruckt (Zeilenenden).-n
Schleifencode;-e
Code sofort danach ausführen. Sehenman perlrun
.Dies kann auch erfolgen mit
'sed'
:Aktualisieren:
oder einfacher:
quelle
Oder mit
cut
:Dies entspricht jedoch nicht der Anforderung einer "allgemeinen Lösung". Mit
rev
zweimal können wir auch dieses Problem lösen:quelle
rev
funktioniert meines Wissens nicht mit 'breiten' Zeichen , sondern nur mit Einzelbyte-Zeichen.Mit können
awk
Sie zunächst prüfen, ob mindestens eine Spalte vorhanden ist.quelle
awk 'NF{print $NF}'
.In Perl kann dies wie folgt erfolgen:
Ausgabe:
Sie können auch eine Datei durchlaufen. Hier ist ein Beispielskript, das ich geschrieben habe, um eine Datei namens budget.dat zu analysieren
Beispieldaten in budget.dat:
(Sie können sehen, ich brauchte nur die "letzte" Spalte zu erfassen, nicht nur Spalte 2)
Das Drehbuch:
quelle