Ich möchte nur die letzten beiden Spalten drucken.
Ich möchte nur die letzten beiden Spalten drucken.
Antworten:
Sie können eine Variable verwenden, NF
die auf die Gesamtzahl der Felder im Eingabedatensatz festgelegt ist:
awk '{print $(NF-1),"\t",$NF}' file
Dies setzt voraus, dass Sie mindestens 2 Felder haben.
awk '{print $(NF-1) "\t" $NF}' file
oder awk '{print $(NF-1), $NF}' file
oder sein awk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file
.
'{print $x,"\t",$y}'
darin, dass awk jede durch Kommas getrennte Variable als eigenes Feld interpretiert, sodass das Ergebnis tatsächlich field1<space><tab><space>field2
ist (da standardmäßig ein Leerzeichen-Trennzeichen verwendet wird), im Gegensatz zu field1<tab>field2
dem , was wahrscheinlich das ist Sie erwarten. Die Verwendung von Output Field Separator (OFS) ist fast immer das, was Sie wollen.
awk '{print $NF-1, $NF}' inputfile
Hinweis: Dies funktioniert nur, wenn mindestens zwei Spalten vorhanden sind. Bei Datensätzen mit einer Spalte erhalten Sie eine falsche"-1 column1"
echo 1 2 3 | awk ...
. $NF-1
ist ($NF) - 1
in jeder awk
Implementierung.
yacc
Grammatik, was ironisch ist, wenn man bedenkt, wofür das A in awk steht. Verschiedene Versionen von awk, die Dinge unterschiedlich analysieren? Große Überraschung!
echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'
- oder einer anderen Eingabe, bei der das vorletzte Feld nicht kleiner als das letzte Feld ist.
@jim mcnamara: Verwenden Sie Klammern für around NF
, dh $(NF-1)
und $(NF)
anstelle von $NF-1
und $NF
(funktioniert unter Mac OS X 10.6.8 für FreeBSD awk
und gawk
).
echo '
1 2
2 3
one
one two three
' | gawk '{if (NF >= 2) print $(NF-1), $(NF);}'
# output:
# 1 2
# 2 3
# two three
$(NF-1)
- die zumindest portabler ist als $NF-1
; es ist definitiv weniger mehrdeutig. $(NF)
ist allerdings übertrieben - reicht einfach aus $NF
. Das Schützen vor Zeilen mit weniger als 2 Spalten lohnt sich ebenfalls, da bei einspaltigen Zeilen der erste Spaltenwert zweimal angezeigt wird und bei nullspaltigen, dh leeren Zeilen der Befehl awk aufgrund eines Versuchs insgesamt fehlschlägt um auf ein Feld mit dem Index -1 zuzugreifen.
Die Verwendung von Gawk zeigt das Problem:
gawk '{ print $NF-1, $NF}' filename
1 2
2 3
-1 one
-1 three
# cat filename
1 2
2 3
one
one two three
Ich habe gerade Solaris 10 M4000 gawk: Also, gawk ist der Cuplrit in der Frage $ NF-1 vs. $ (NF-1). Nächste Frage, was sagt POSIX? pro:
http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html
Es gibt keine Richtung in die eine oder andere Richtung. Nicht gut. gawk impliziert Subtraktion, andere awks implizieren Feldnummer oder Subtraktion. hmm.
$(NF-1)
ist, dass die beiden Beispiele für die Berechnung des Feldindex in der Spezifikation beide diese Form verwenden: $(NF-1)
und $(NF+2)
. Dann gibt es den Abschnitt "Ausdrücke in awk", in dem $expr
[viel] Vorrang als aufgeführt ist expr - expr
. Da NF
ist ein Ausdruck selbst, $NF-1
sollte zu bewerten ($NF)-1
. Selbst wenn es tatsächlich awk-Implementierungen gibt, die $NF-1
als bewertet werden $(NF-1)
, ist die hier gewonnene Erkenntnis, dass die Verwendung $(NF-1)
die sichere und tragbare Wahl ist.
versuche es damit
$ cat /tmp/topfs.txt
/dev/sda2 xfs 32G 10G 22G 32% /
awk print last column
$ cat /tmp/topfs.txt | awk '{print $NF}'
awk print before last column
$ cat /tmp/topfs.txt | awk '{print $(NF-1)}'
32%
awk - print last two columns
$ cat /tmp/topfs.txt | awk '{print $(NF-1), $NF}'
32% /
Bitte probieren Sie dies aus, um alle möglichen Szenarien zu berücksichtigen:
awk '{print $(NF-1)"\t"$NF}' file
oder
awk 'BEGIN{OFS="\t"}' file
oder
awk '{print $(NF-1), $NF} {print $(NF-1), $NF}' file