2016-07-28 19 views
0

Verwandte Frage ist here.awk Anfänger versucht zu verstehen awk "Denkprozess"

Ich habe zwei Dateien:

Datei 1:

I am a cat 
I am a dog  
I am a dog 
I am a cat 
I am a dog 

Datei 2:

line 1 
line 2 

Nach Ausführung:

awk '/cat/{getline <"file2"; print};1' file1 
line 1 
line 1 
I am a dog 
I am a dog 
line 2 
line 2 
I am a dog 

Ich erwarte:

line 1 
I am a cat 
I am a dog 
I am a dog 
line 2 
I am a cat 
I am a dog 

Mein Verständnis von awk im obigen Code:

liest Zeile aus der Datei 1, wenn cat Druckzeile von file 2 und die 1 am Ende awk existiert erzählt auch die Linie von file 1 zu drucken. Wenn cat nicht gefunden wird, druckt awk nichts aus file 2, aber druckt immer noch die entsprechende Zeile aus file 1.

Was scheint zu geschehen ist awk liest die erste Zeile von file 1, findet cat und druckt die erste Zeile von file 2. Dann spreizt awk die 1 als eine der angegebenen Bedingung und druckt erneut die erste Zeile aus file 2. Wenn awk cat nicht findet, interagiert das 1 als ein wahres und druckt von file 1?

Etwas anderes ich interessant fand, ist, wenn ich dies auszuführen:

awk '/cat/{getline this<"file2"; print this};1' file1 
line 1 
I am a cat 
I am a dog 
I am a dog 
line 2 
I am a cat 
I am a dog 

Was ist hier los? Vielen Dank für Ihre Zeit.

+0

Hoffentlich ist dies eine akademische Frage und Sie erwägen nicht, irgendwelche der Skripte in Ihrer Frage zu verwenden. Wenn Sie dann http://awk.freeshell.org/AllAboutGetline sehen. –

+0

Danke für die Info @Ed Morton. Nicht wirklich für irgendetwas zu verwenden, nur zu lernen. – thecomebackid

Antwort

1
awk '/cat/{getline <"file2"; print};1' file1 
line 1 
line 1 
I am a dog 
I am a dog 
line 2 
line 2 
I am a dog 

Wenn die Leitung I am a cat verarbeitet wird, passt es /cat/. Und so wird die Aktion ausgeführt. Die Aktion liest einen Datensatz aus , der den aktuellen $0line 1 ersetzt. Dann wird die zweite Regel ausgelöst, die aus 1 besteht. 1 ist ein Ausdruck, der immer wahr ist, also passt er zu jedem Datensatz. Es hat keine Aktion und daher ist die Standardaktion "Drucken". Somit wird der aktuelle Datensatz gedruckt und Sie sehen wieder line 1.

Das zweite Auftreten von cat führt dazu, dass line 2 gedruckt wird. Die getline Syntax behält einen offenen Strom bei, der damit verknüpft ist, so dass mehrere Auswertungen desselben Ausdrucks aufeinanderfolgende Zeilen lesen. line 2 wird zweimal aus dem gleichen Grund wie oben gedruckt.

Im zweiten Beispiel verwenden Sie die getline Syntaxvariante, die in einen bestimmten Variablennamen liest. Daher wird der aktuelle Datensatz nicht ersetzt. Wenn die 1 Regel ausgewertet wird, ist der aktuelle Datensatz noch I am a cat, und so ist, dass gedruckt, anstatt line 1 oder line 2.