Die Awk-Else-If-Anweisung scheint zweimal ausgeführt zu werden

Die Awk-Else-If-Anweisung scheint zweimal ausgeführt zu werden

Ich möchte die folgenden Aufgaben ausführen:

1) Wort drucken, wenn die Wortanzahl der Zeile = 1

2) 4. Wort drucken, wenn die Wortanzahl der Zeile > 3 ist

3) in allen anderen Fällen eine leere Zeile drucken

Die Eingabedatei ist

cat file.txt
Hi there I welcome you
Hi there You
Hi
Hi there
Hi there I welcome you all

Die erwartete Ausgabe ist:

welcome

Hi

welcome

Wenn ich den folgenden Code verwende, erhalte ich eine Ausgabe mit einer zusätzlichen Leerzeile, was nicht erwartet wurde.

cat file.txt | awk '{ if (NF>3) {print $4} else if (NF==1) {print $1} else {print "\n"} }'
welcome


Hi


welcome

Ich habe dies mit dem folgenden Code gelöst:

cat file.txt | awk '{ if (NF>3) {print $4} else if (NF==1) {print $1} else {print $10000} }'
welcome

Hi

welcome

Ich möchte jedoch verstehen, was schief gelaufen ist und warum die Anweisung sonst zweimal ausgeführt wird und mir eine unerwartete Ausgabe liefert.

Antwort1

Dies liegt daran, dass printdie Anweisung standardmäßig eine neue Zeile am Ende der Zeichenfolge hinzufügt, die sie ausgibt. Wenn sie zusammen verwendet wird, \nwird eine doppelte neue Zeile gedruckt, wie Sie in der Ausgabe sehen. Verwenden Sie printfstattdessen

awk '{ if (NF>3) {print $4} else if (NF==1) {print $1} else printf "\n" }' file

Ohne die expliziten Zweigkonstrukte if..else if..elsekönnen Sie einfach

awk 'NF>3 { print $4; next } NF==1 { print $1; next } { printf "\n" }'

Antwort2

Der printBefehl fügt immer eine neue Zeile hinzu. print "\n"Druckt also die von Ihnen angegebene neue Zeile plus die hinzugefügte.

Sie können print ""oder verwenden printf "\n".

verwandte Informationen