On Mon, 13 Mar 2017 20:52, K. Elo wrote:
Hallo!
Ich hätte eine Verständnisfrage zu 'awk'. Weiss nicht so richtig, ob es ein Bug ist oder ein Feature :)
Ich habe die folgende Datei (test.csv):
--- snip --- A a B A a B C D A a B C A a B C D E A a B C --- snip ---
Die Felder sind mit Tabs getrennt.
Wenn ich jetzt den Befehl
awk '{ OFS=FS="\t"; for (i=2; i<=NF; i++) print $1, $i }' test.csv
ausführe, kommt folgendes raus:
A a <==== HIER! A B A a B A a C A a D A a B A a C A a B A a C A a D A a E A a B A a C
Warum wird die erste Zeile anders (=falsch) getrennt als der Rest?? In der 1. Zeile wird das Leerzeichen in "A a" zum Trennzeichen, was nicht sein sollte!
Füge ich aber eine leere Zeile am Anfagen von 'test.csv' ein, also:
--- snip ---
A a B A a B C D A a B C A a B C D E A a B C --- snip ---
spuckt 'awk' das richtige (oder: erwartete) Ergebnis raus:
awk '{ OFS=FS="\t"; for (i=2; i<=NF; i++) print $1, $i }' test.csv A a B A a B A a C A a D A a B A a C A a B A a C A a D A a E A a B A a C
Kann jemand das erklären? Ich habe hier openSuSE Leap 42.2 im Betrieb.
Beste Grüße, Kimmo
Hmmm, Reihenfolge bei awk / gawk: awk führt beim Start nachden Kommandozeilen optionen die "BEGIN" Sektion aus, liest dann eine Zeile ein, und führt damit die "Hauptsektion" aus, wiederholung bis EOF, danach wird die "END" sektion ausgeführt. ERGO: der 'OFS=FS="\t";' Krempel gehört in die "BEGIN" Sektion, oder als Kommandozeilen parameter angegeben, sonst wird der nur ab Zeile zwei und folgenden Zeilen beim einlesen berücksichtigt. Siehe auch "man 1 awk", "info awk" oder "pinfo awk", als auch O'Reilly: "sed & awk - kurz & gut" Beispiel hier mit BEGIN: awk 'BEGIN{ OFS=FS="\t" } { for (i=2; i<=NF; i++) print $1, $i }' test.csv oder mit extra Option: awk -F"\t" '{ OFS=FS; for (i=2; i<=NF; i++) print $1, $i }' test.csv Ist das verständlich? - Yamaban