2012-04-03 2 views
2

Ich finde es schwierig, meine Shell-Skripte zu debuggen. Ich habe die folgende Datei test.csvWarum druckt mein awk-Befehl eine zusätzliche Zeile?

The Gardens,Gard (AUS),AEST,NSW,,Sandown Park,SPrk (AUS),AEST,VIC,,Grade 5,GR5, 
Wentworth Park,WPrk (AUS) ,AEST,NSW,,The Meadows,Mead (AUS),AEST,VIC,,Juvenille,JUV, 
Angle Park,AnPk (AUS),ACST,SA,,Warragul,Wgul (AUS),AEST,VIC,,,, 

Wprk (AUS) einen zusätzlichen Leerraum hat, die ich mag trimmen und dann drucken. Laufen

awk -F\, 'gsub(/[ \t]+$/, "", $2); {print $2 ":"}' test.csv 

Produziert

Gard (AUS): 
Wentworth Park WPrk (AUS) AEST NSW The Meadows Mead (AUS) AEST VIC Juvenille JUV 
WPrk (AUS): 
AnPk (AUS): 

Was ist das, was ich will, außer für die zweite Zeile kann ich nicht herausfinden, warum das

+0

versuchen 'printf (fmt, a1, a2, ...)' – kev

+0

Versuch ohne '2' vielleicht $ Druck? –

Antwort

4
awk -F\, 'gsub(/[ \t]+$/, "", $2); {print $2 ":"}' test.csv 

Da Sie gsub außerhalb jeder Aktionsblock ({...}) haben, wird jede Zeile als Bedingung ausgewertet. Es gibt die Anzahl der Ersetzungen zurück, die es gemacht hat, daher gibt es bei den meisten Eingaben 0 zurück, aber 1 in den Zeilen, die Sie ändern möchten. Da keine Aktion vorhanden ist, wird die Standardaktion ausgeführt, wobei die Zeile gedruckt wird. Deshalb erhalten Sie die vollständige Zeile gedruckt.

Das Update, wie andere gesagt haben, setzt den gsub Aufruf in den Aktionsblock.

(Auch, warum \,? Comma ist kein Sonderzeichen in der Schale.)

2

erscheint Wie wäre es den Befehl zu ändern sein:

Das bewegt '{' nach vorne.

Herausgegeben Wie bereits gesagt, Sie brauchen nicht Komma zu entkommen, -F, genug ist. Danke an andere Beantworter :).

2

Sie schrieb:

awk -F\, 'gsub(/[ \t]+$/, "", $2); {print $2 ":"}' test.csv 

Dieser gebrochen ist.

Das Format für ein awk-Skript ist eine Reihe von Konstrukten, die wie folgt aussehen:

hier
 
    condition { 
    command; 
    ... 
    } 

Die Idee ist, dass jede Zeile in der Eingabedaten gegen Zustand ausgewertet wird. Wenn es übereinstimmt, werden die Befehle in den entsprechenden geschweiften Klammern ausgeführt. Also, was Sie wahrscheinlich wollen, ist mehr entlang den Linien dieses:

awk -F, '{gsub(/[ \t]+$/, "", $2); print $2 ":";}' test.csv 

Beachten Sie, dass Sie nicht brauchen, das Feldtrennzeichen zu entkommen, es sei denn die Shell es schlecht behandeln wird (dh, wenn es sich um eine vertikale Leiste war, |, anstelle eines Kommas). Indem Sie die Bedingung innerhalb des Skripts ausschließen, führen Sie die geschweiften Klammern in JEDER Zeile aus. So wird $ 2 getrimmt, ob es getrimmt werden muss oder nicht, dann drucken Sie das Ergebnis für Ihr Beispiel in Ihrer Frage.

+0

Es ist nicht im Sinne der Syntax, nur logisch gebrochen. Wie es ist, wird es als eine Bedingung bewertet. – Kevin