2012-07-27 1 views
23

Die Ausgabe von meinem Skript überspringen ist begrenzt Reiter awk als:Awk die leeren Zeilen

awk -v variable=$bashvariable '{print variable"\t single\t" $0"\t double"}' myinfile.c 

Der awk Befehl in einer while-Schleife ausgeführt wird, die den Variablenwert aktualisiert und die Datei myinfile.c für jeden Zyklus. Ich bekomme die erwarteten Ergebnisse mit diesem Befehl. Aber wenn die inmyfile.c enthält eine leere Zeile (es kann enthalten), druckt es keine relevanten Informationen. kann ich awk sagen, um die Leerzeile zu ignorieren?

Ich weiß, es kann getan werden, indem Sie die Leerzeilen aus myinfile.c vor dem Weiterleiten an awk entfernen. Ich bin in Kenntnis von sed und tr Weg, aber ich möchte awk es in dem oben genannten Befehl selbst tun und nicht eine separate Lösung wie unten oder eine Piped One.

sed '/^$/d' myinfile.c 
tr -s "\n" < myinfile.c 

Vielen Dank im Voraus für Ihre Vorschläge und Antworten.

Antwort

38

Es gibt zwei Ansätze, die Sie versuchen können, Linien heraus zu filtern:

awk 'NF' data.txt 

und

awk 'length' data.txt 

Gerade diese von Ihrem Befehl zu Beginn setzen, dh

awk -v variable=$bashvariable 'NF { print variable ... }' myinfile 

oder

awk -v variable=$bashvariable 'length { print variable ... }' myinfile 

Beide fungieren als Gatekeeper/if-Anweisungen.

Der erste Ansatz funktioniert, indem nur Zeilen ausgedruckt werden, bei denen die Anzahl der Felder (NF) nicht Null ist (d. H. Größer als Null).

Die zweite Methode befasst sich mit der Zeilenlänge und wirkt, wenn die Länge nicht Null ist (das heißt, größer als Null) ist

Sie können den Ansatz wählen, die für Ihre Daten/Bedürfnisse am besten geeignet ist.

2

können Sie dies ausprobieren könnte:

awk -v variable=$bashvariable '$0{print variable"\t single\t" $0"\t double"}' myinfile.c 
1

Versuchen Sie folgendes:

awk -v variable=$bashvariable '/^.+$/{print variable"\t single\t" $0"\t double"}' myinfile.c 
8

Sie haben soeben

/^\s*$/ {next;} 

An der Vorderseite des Skripts könnte hinzufügen, dass das Spiel wird leere Zeilen und überspringe den Rest der awk passenden Regeln. Setzen Sie alles zusammen:

awk -v variable=$bashvariable '/^\s*$/ {next;} {print variable"\t single\t" $0"\t double"}' myinfile.c