Warum gibt awk die gesamte Zeile aus, wenn ich möchte, dass eine Variable gedruckt wird?

24

Wenn ich tippe:

echo "foo bar" | gawk -v var="content" '{print $var}'

Ich erwarte, dass die Ausgabe sein wird content. Warum ist es so foo bar?

nicoco
quelle
8
Versuchen Sie das Entfernen $von $ var
taliezin
Tatsächlich. Ich wurde mit der Bash-Syntax verwechselt ...
nicoco
Es ist eine gute Frage, und obwohl die Antwort zeigt, dass die $falsch platziert wurde, bin ich nicht sicher, ob sie als Tippfehler geschlossen werden sollte. Ich habe in letzter Zeit mehrere davon gesehen, also brauchen wir vielleicht eine kanonische
roaima

Antworten:

45

Variablen werden mit Namen wie in varund nicht $varin referenziert awk. $nbezieht sich auf das ndritte Feld : $1für das erste Feld, $2für das zweite ... oder den gesamten Datensatz für n== 0 ( $0ist der vollständige Datensatz).

Das müssen keine wörtlichen Zahlen sein. Sie können $(1+1)oder verwenden $variable. Wenn variableenthält 1, $variablewird das erste Feld sein. Eine häufig verwendete ist $NFfür das letzte Feld ( NFist die spezielle Variable, die die Anzahl der Felder enthält).

Wenn Sie , wie in Ihrem Beispiel ist die Variable nicht eine Nummer enthalten, dass nicht-Nummer wird als 0 verstanden.

Ist var="content"; print $varalso dasselbe wie var=0; print $varund damit dasselbe wie print $0, dass der gesamte Datensatz gedruckt wird.

Was Sie hier wollen, ist:

echo "foo bar" | gawk -v var="content" '{print var}'
Stéphane Chazelas
quelle