2010-11-29 9 views

Antwort

158

Sie können Verwendung von variablen NF machen, die auf die Gesamtzahl der Felder in dem Eingabedatensatz festgelegt ist:

awk '{print $(NF-1),"\t",$NF}' file 

dies setzt voraus, dass Sie zumindest 2 Felder.

+1

Sie brauchen ein Komma - seit Wir sind heute pingelig: Raum verkettet Felder, Komma trennt Felder in einer Druckanweisung. Dadurch werden die beiden Felder zusammengeführt. –

+15

Jetzt drucken Sie "field-OFS-tab-OFS-field".Es sollte "awk" sein {print $ (NF-1) "\ t" $ NF} 'Datei' oder 'awk' {print $ (NF-1), $ NF} 'Datei' oder 'awk' BEGIN {OFS = "\ t"} {print $ (NF-1), $ NF} 'Datei'. –

10
awk '{print $NF-1, $NF}' inputfile 

Hinweis: Dies funktioniert nur, wenn mindestens zwei Spalten vorhanden sind. Auf Aufzeichnungen mit einer Spalte erhalten Sie eine falsche "-1 column1"

+7

'$ NF-1' wird nicht funktionieren. – codaddict

+2

Versuchen Sie und sehen. Es funktioniert Solaris 9 awk & nawk. Die Alternative ist $ (NF-1) –

+1

Hier gehen Sie: http://www.ideone.com/FQCuF – codaddict

1

gaffen mit 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 nur setzen gaffen auf Solaris 10 M4000: So gawk ist die cuplrit auf dem $ NF-1 vs. $ (NF-1) Thema. Nächste Frage was sagt POSIX? pro:

http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html 

Es gibt keine Richtung der einen oder der anderen Seite. Nicht gut. gawk impliziert Subtraktion, andere awks implizieren Feldnummer oder Subtraktion. hmm.

+1

Die ersten beiden Zeilen der Beispieleingabedatei sind nicht hilfreich, da sie dieselbe Ausgabe mit _either_-Verhalten erzeugen. Können Sie bitte bestätigen, dass sich Solaris awk in diesem Fall NICHT wie ein Gähnen verhält? – mklement0

+0

Wie für Ihre Verbindung zu der awk-Spezifikation: Das anekdotische Argument für die Verwendung von $ (NF-1) ist, dass die beiden Beispiele zur Berechnung der Feld-Index in der Spezifikation beide diese Form verwenden: $ (NF-1) und '$ (NF + 2)'. Dann gibt es den Abschnitt "Ausdrücke in awk", in dem "$ expr" eine viel höhere Priorität als "expr - expr" hat. Da "NF" ein Ausdruck selbst ist, sollte "$ NF-1" zu "($ NF) -1" ausgewertet werden. Selbst wenn es schließlich tatsächlich awk-Implementierungen gibt, die '$ NF-1' als '$ (NF-1)' auswerten, ist die Lektion, die hier gelernt wird, dass die Verwendung von '$ (NF-1)' das sichere und ist tragbare Wahl. – mklement0

7

@jim mcnamara: versuchen Sie mit Klammern für um NF, ich. e. $(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 
+0

Wir hatten schon() früher gedacht. Ich dachte, wir diskutierten darüber, woher das ursprüngliche alte awk-Verhalten kam. –

+0

+1 für eine Antwort mit expliziten '$ (NF-1)' - die zumindest portabler ist als '$ NF-1'; es ist definitiv weniger zweideutig. '$ (NF)' ist Overkill, obwohl - nur '$ NF' reicht. Der Schutz gegen Zeilen mit weniger als 2 Spalten ist ebenfalls sinnvoll, da bei einspaltigen Zeilen der erste Spaltenwert * zweimal * und bei nullspalten - also leeren Zeilen - der Befehl awk aufgrund von ein Versuch, auf ein Feld mit Index -1 zuzugreifen. – mklement0

Verwandte Themen