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 -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
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
Hallo! 13.03.2017, 22:17, Yamaban schrieb:
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?
Danke, Yamaban, für deine schnelle Antwort. Das ist nun klar und künftig werde ich die "BEGIN" Konstruktion verwenden. Danke nochmals & Gruß, Kimmo -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
participants (2)
-
K. Elo
-
Yamaban