Ich möchte die vorletzte Spalte oder das vorletzte Feld in awk drucken. Die Anzahl der Felder ist variabel. Ich weiß, dass ich in der Lage sein sollte, $NF
aber nicht sicher, wie es verwendet werden kann.
Und das scheint nicht zu funktionieren:
awk ' { print ( $NF-- ) } '
NF
ist der letzte$NF
Antworten:
Sollte arbeiten
quelle
awk -F '.' '{print $(NF-2)}'
$(..)
ein Befehl in einer Subshell aufgerufen wird, je nachdem, welche Shell Sie verwenden. Sie können dies umgehen, indem Sie$ (NF-1)
anstelle von verwenden$(NF-1)
.Kleine Ergänzung zu Chris Kannons akzeptierter Antwort: Nur drucken, wenn tatsächlich eine vorletzte Spalte vorhanden ist.
quelle
Es ist am einfachsten:
Der Grund, warum das Original
$NF--
nicht funktioniert hat, ist, dass der Ausdruck vor dem Dekrement ausgewertet wird, während mein Präfix-Dekrement vor dem Auswerten ausgeführt wird.quelle
int x = ++i
int x = i++
, Präfix bedeutet zuerst Inkrementieren; Postfix bedeutet späteres Inkrementieren (Zuweisung zuerst).quelle
Sie waren nicht weit vom Ergebnis entfernt! Das macht es:
Dies verringert die Anzahl der Felder in einem, so dass
$NF
das vorletzte Feld enthalten ist.Prüfung
Lassen Sie uns einige Zahlen generieren und sie in 5er-Gruppen drucken:
Drucken wir das vorletzte in jede Zeile:
quelle
Perl-Lösung ähnlich der awk-Lösung von Chris Kannon:
Diese Befehlszeilenoptionen werden verwendet:
n
Schleife um jede Zeile der Eingabedatei, drucke nicht automatisch jede Zeilel
Entfernt Zeilenumbrüche vor der Verarbeitung und fügt sie anschließend wieder hinzua
Autosplit-Modus - Teilen Sie die Eingabezeilen in das@F
Array. Standardmäßig wird auf Leerzeichen aufgeteilte
Führen Sie den Perl-Code ausDas
@F
Autosplit-Array beginnt bei Index [0], während awk-Felder mit $ 1 beginnen.$#F
ist die Anzahl der Elemente in@F
quelle
$F[-2]
Haben Sie versucht, mit dem Befehl rev von rechts nach links zu beginnen? In diesem Fall müssen Sie nur die 2. Spalte drucken:
quelle
Dekrementiert zuerst den Wert und druckt ihn dann aus -
ODER
quelle
Wenn Sie viele Spalten haben und alle bis auf die drei Spalten in der letzten Spalte drucken möchten, kann dies hilfreich sein
awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'
quelle