Forum: PC-Programmierung AWK : Jede zweite Zeile ausgeben


von klaus (Gast)


Lesenswert?

Hallo,

Ich möchte aus einen TextfileIN der Form:

1234
1235
1346
1468

jede zweite Zeile ausgeben. ich habe hierfür versucht mit gawk den 
modolo Befehl zu nutzen.

gawk 'NR%2==1'  TextfileIN.txt

Jedoch wird mir mit diesem Befehl immer nur die Zeile 1 ausgegeben. 
ollte nicht eigentlich jede Zeile ausgegeben werden, deren Zeilennummer 
/ 2 keinen Rest hat?

Danke

von chris (Gast)


Lesenswert?

NF { i++ }
 i&1 { print }

von R. M. (rmax)


Lesenswert?

klaus schrieb:

> jede zweite Zeile ausgeben. ich habe hierfür versucht mit gawk den
> modolo Befehl zu nutzen.
>
> gawk 'NR%2==1'  TextfileIN.txt
>
> Jedoch wird mir mit diesem Befehl immer nur die Zeile 1 ausgegeben.

Bei mir gibt das Kommando wie erwartet alle ungeraden Zeilen aus:

~ $ gawk 'NR%2==1' TextfileIN.txt
1234
1346

> ollte nicht eigentlich jede Zeile ausgegeben werden, deren Zeilennummer
> / 2 keinen Rest hat?

Nein, die Zeilen, deren Nummer / 2 einen Rest von 1 hat, also die 
ungeraden. Wenn Du die geraden willst, mußt Du 'NR%2==0' verwenden.

von klaus (Gast)


Lesenswert?

>Nein, die Zeilen, deren Nummer / 2 einen Rest von 1 hat, also die
>ungeraden. Wenn Du die geraden willst, mußt Du 'NR%2==0' verwenden.

Ja da habe ich mich verschrieben. Ist klar.

Jedoch wird bei mir nur immer ein Wert ausgegeben...Woran kann das 
liegen?

von R. M. (rmax)


Lesenswert?

klaus schrieb:
> Jedoch wird bei mir nur immer ein Wert ausgegeben...Woran kann das
> liegen?

Entweder Dein awk hat nen Hau oder die Textdatei (z.B andere Zeilenenden 
als der awk erwartet). Welche gawk-Version verwendest Du denn (gawk 
--version) und auf welchem Betriebssystem?

Um mal zu testen, ob Dein awk die Zeilen überhaupt richtig erkennt und 
zählt, kannst Du mal das ausprobieren:

~ $ gawk '{print NR ":" $0}' TextfileIN.txt
1:1234
2:1235
3:1346
4:1468

von klaus (Gast)


Lesenswert?

Das awk erkennt die Zeilen richtig. Es wird wie gewollt dargestellt. 
Jedoch scheint das %2 einfach ignoriert zu werden.

Gawk version ist die 3.1.6

von klaus (Gast)


Lesenswert?

Wie könnte man es noch ohne Modulo machen? Vielleicht kann ich das 
umgehen?

von R. M. (rmax)


Lesenswert?

Hast Du es mal mit "sauberem" Input probiert, um zu sehen, ob es am awk 
oder an der Textdatei liegt?

~ $ echo -ne '1\n2\n3\n4\n' | awk 'NR%2==1'
1
3

Wenn hier auch nur '1' herauskommt, liegt es wohl am awk, ansonsten an 
Deinem Input. In dem Fall würde ich von der Datei mal einen Hexdump 
machen und schauen, wie die Zeilenenden aussehen (\n, \r\n, \r oder ganz 
anders).

von R. M. (rmax)


Lesenswert?

klaus schrieb:
> Wie könnte man es noch ohne Modulo machen?

z.B. so:

~ $ echo -ne '1\n2\n3\n4\n' | awk '{if (x==0) {x=1; print} else {x=0}}'
1
3

... oder mit sed:

~ $ echo -ne '1\n2\n3\n4\n5\n6\n' | sed -n 'p;n'
1
3
5

... und für die geraden Zeilen:

~ $ echo -ne '1\n2\n3\n4\n5\n6\n' | sed -n 'n;p'
2
4
6

> Vielleicht kann ich das umgehen?

Ich würde eher die Ursache des Problems suchen als es zu umgehen, denn 
dieselbe Ursache könnte auch noch andere, weniger offensichtliche Fehler 
zur Folge haben.

von klaus (Gast)


Lesenswert?

>Ich würde eher die Ursache des Problems suchen als es zu umgehen, denn
>ieselbe Ursache könnte auch noch andere, weniger offensichtliche Fehler
>zur Folge haben.

Hab gerade keine Idee woran es liegen könnte....

von R. M. (rmax)


Lesenswert?

klaus schrieb:

> Hab gerade keine Idee woran es liegen könnte....

Hast Du den Test denn gemacht, den ich in meinem vorletzten Beitrag 
gepostet hatte? Falls ja, weißt Du jetzt zumindest, ob es an der Datei 
oder am awk liegt und das ist schonmal mehr als "keine Idee". ;)

von Simon K. (simon) Benutzerseite


Lesenswert?

Ohne Modulo siehe oben mit der UND Verknüpfung.

von klaus (Gast)


Lesenswert?

Ja es liegt nicht an der Datei. Aus der kann gawk die Zeilennummern 
feststellen. Danke euch für die Hilfe

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.