2014-05-05 9 views
6

Dieser Befehl funktioniert. Es gibt die Feldtrennzeichen (in diesem Fall wird ein Komma):Warum verliert eine awk-Feldzuweisung das Ausgabefeldtrennzeichen?

$ echo "hi,ho"|awk -F, '/hi/{print $0}' 
hi,ho 

Dieser Befehl hat seltsamer Ausgang (es das Komma fehlt):

$ echo "hi,ho"|awk -F, '/hi/{$2="low";print $0}' 
hi low 

Einstellen des OFS (output Feldseparator) Variable Ein Komma behebt diesen Fall, aber es erklärt dieses Verhalten nicht wirklich.

Kann ich awk sagen, um den OFS zu behalten?

Antwort

10

Wenn Sie die Linie ($0) awk Wieder Konstrukte alle Spalten ändern und den Wert von OFS zwischen ihnen setzt die standardmäßigRaum. Sie haben den Wert $2 geändert, was bedeutet, dass Sie awk gezwungen haben, $0 neu zu bewerten.

Wenn Sie im ersten Fall die Zeile mit der Nummer $0 drucken, da Sie keine Felder geändert haben, hat awk nicht jedes Feld neu ausgewertet und daher bleibt das Feldtrennzeichen erhalten.

Um das Feldtrennzeichen zu erhalten, können Sie festlegen, dass die Verwendung von:

BEGIN Block:

$ echo "hi,ho" | awk 'BEGIN{FS=OFS=","}/hi/{$2="low";print $0}' 
hi,low 

Mit -v Option:

$ echo "hi,ho" | awk -F, -v OFS="," '/hi/{$2="low";print $0}' 
hi,low 

Definition bei das Ende awk:

$ echo "hi,ho" | awk -F, '/hi/{$2="low";print $0}' OFS="," 
hi,low 
+2

Oh, in der Zeit zurückzugehen und 'FS' zu haben bedeutet sowohl Eingabe als auch Ausgabe" Field Separator "und habe 'IFS getrennt 'und' OFS'-Variablen für die seltenen Fälle, in denen Sie Input- und Output-Feldseparatoren einzeln setzen möchten. Naja .... +1. –

0

Setzen Sie in Ihrer BEGIN-Aktion OFS = FS.

+2

Normalerweise würden Sie nicht tun '-F‚BEGIN { OFS = FS} .. ', aber' 'BEGIN {OFS = FS = ","} ..' – Jotne

1

Sie erstes Beispiel ändert nichts, so dass alle als Eingang ausgedruckt wird.
Im zweiten Beispiel ist es die Zeile, und es wird den Standard OFS verwenden, das heißt (ein Raum)
So, dies zu überwinden:

echo "hi,ho"|awk -F, '/hi/{$2="low";print $0}' OFS="," 
hi,low 
Verwandte Themen