
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 print
die Anweisung standardmäßig eine neue Zeile am Ende der Zeichenfolge hinzufügt, die sie ausgibt. Wenn sie zusammen verwendet wird, \n
wird eine doppelte neue Zeile gedruckt, wie Sie in der Ausgabe sehen. Verwenden Sie printf
stattdessen
awk '{ if (NF>3) {print $4} else if (NF==1) {print $1} else printf "\n" }' file
Ohne die expliziten Zweigkonstrukte if..else if..else
können Sie einfach
awk 'NF>3 { print $4; next } NF==1 { print $1; next } { printf "\n" }'
Antwort2
Der print
Befehl 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"
.