Sed oder awk prüfe ob jede 6. Zeile leer ist
-
- Beiträge: 7
- Registriert: 09.07.2016 16:19:25
Sed oder awk prüfe ob jede 6. Zeile leer ist
Hallo Community,
ich brauche ein sed or awk Befehl um jede 6. Zeile zu überprüfen, ob diese leer ist. Wenn dies so ist, soll eine weitere leere Zeile eingefügt werden.
Habt ihr eine Idee?
Vielen Dank im Voraus
Jan
I need a sed or awk command to check every 6th line if it is empty. If it's empty, I need to insert/add another blank line there.
Do you have any Idea?
ich brauche ein sed or awk Befehl um jede 6. Zeile zu überprüfen, ob diese leer ist. Wenn dies so ist, soll eine weitere leere Zeile eingefügt werden.
Habt ihr eine Idee?
Vielen Dank im Voraus
Jan
I need a sed or awk command to check every 6th line if it is empty. If it's empty, I need to insert/add another blank line there.
Do you have any Idea?
Zuletzt geändert von Technikboy04 am 08.08.2022 09:39:51, insgesamt 4-mal geändert.
Re: Sed or awk check every nth line and insert blank line
Warum schreibst du uns denn auf Englisch?
Use ed once in a while!
-
- Beiträge: 7
- Registriert: 09.07.2016 16:19:25
Re: Sed or awk check every nth line and insert blank line
Hab ich mal schnell angepasst. Dachte das es evtl. mehr Sinn ergibt (:
Re: Sed or awk check every nth line and insert blank line
Hier eine sehr kompakte Loesung:
Etwas ausfuehrlicher so:
Erlaeuterung:
Der hintere Teil (d.h. die Bedingung `1' bzw. `{print}') gibt einfach jede Zeile aus.
Der vordere Teil ist die Bedingung, die du beschreibst: jede leere 6. Zeile. Dann wird dort eine leere Zeile (`{print ""}') ausgegeben bzw. im kompakten Befehl wird einfach die Default-Aktion (= die Zeile ausgeben) aktiviert; du willst ja die leere Zeile duplizieren, darum passt das hier zufaellig.
Mit sed waere eine Umsetzung umstaendlicher. Du muesstest dort jeweils fuenf Zeilen puffern, dann die sechste pruefen, usw.
Edit: Ich hoffe, ich habe hier keine Hausaufgaben gemacht ... aber gerade sind ja Semesterferien ...
Code: Alles auswählen
awk 'NR%6==0 && /^$/; 1'
Code: Alles auswählen
awk 'NR%6==0 && /^$/ {print ""} {print}'
Der hintere Teil (d.h. die Bedingung `1' bzw. `{print}') gibt einfach jede Zeile aus.
Der vordere Teil ist die Bedingung, die du beschreibst: jede leere 6. Zeile. Dann wird dort eine leere Zeile (`{print ""}') ausgegeben bzw. im kompakten Befehl wird einfach die Default-Aktion (= die Zeile ausgeben) aktiviert; du willst ja die leere Zeile duplizieren, darum passt das hier zufaellig.
Mit sed waere eine Umsetzung umstaendlicher. Du muesstest dort jeweils fuenf Zeilen puffern, dann die sechste pruefen, usw.
Edit: Ich hoffe, ich habe hier keine Hausaufgaben gemacht ... aber gerade sind ja Semesterferien ...
Use ed once in a while!
Re: Sed oder awk prüfe ob jede 6. Zeile leer ist
Was ist denn in diesem Kontext "jede 6. Zeile"?
Konkret:
Wenn Zeile 6 leer ist, soll also danach eine weitere Leerzeile eingefügt werden. Ist dann die nächste zu prüfende Zeile, die alte Zeile 12 (nun Zeile 13), oder die neue Zeile 12 (vormals Zeile 11)?
Konkret:
Wenn Zeile 6 leer ist, soll also danach eine weitere Leerzeile eingefügt werden. Ist dann die nächste zu prüfende Zeile, die alte Zeile 12 (nun Zeile 13), oder die neue Zeile 12 (vormals Zeile 11)?
Re: Sed oder awk prüfe ob jede 6. Zeile leer ist
Ich habe angenommen, dass sich die Zeilenzaehlung auf den Input bezieht. Das ist in der Praxis der uebliche Fall. Wenn sich die Zeilenzaehlung auf den Output beziehen sollte, dann haette ich erwartet, dass die Aufgabe anders formuliert waere.hikaru hat geschrieben:08.08.2022 09:46:45Was ist denn in diesem Kontext "jede 6. Zeile"?
Konkret:
Wenn Zeile 6 leer ist, soll also danach eine weitere Leerzeile eingefügt werden. Ist dann die nächste zu prüfende Zeile, die alte Zeile 12 (nun Zeile 13), oder die neue Zeile 12 (vormals Zeile 11)?
Hier war kein grosser Entwicklungsaufwand noetig, darum war es mir nicht wichtig, zuerst abzuklaeren, ob ich alles richtig verstanden habe. Ich habe den Ansatz gewaehlt, einfach mal eine Loesung zu erstellen und zu schauen, ob diese passt. Das ist gerade bei nicht so technisch denkenden Menschen (ohne hier etwas unterstellen zu wollen!) oft erfolgreicher, weil sie es dann sehen koennen und es sich nicht abstrakt vorstellen muessen. Es hilft auch wenn man sich nicht so gut kennt und die Kommunikation moeglicherweise schwierig ist. Aber natuerlich, wenn dafuer eine groessere Programmierleistung noetig waere, dann wuerde ich auch zuerst genauer wissen wollen, ob ich alles richtig verstanden habe.
Use ed once in a while!
Re: Sed oder awk prüfe ob jede 6. Zeile leer ist
Die Länger einer Zeile läßt sich mit awk mit
Code: Alles auswählen
length($0)
Was soll passieren, wenn zwischendurch die sechste Zeile mal nicht leer ist?Befehl um jede 6. Zeile zu überprüfen, ob diese leer ist. Wenn dies so ist, soll eine weitere leere Zeile eingefügt werden.
-
- Beiträge: 7
- Registriert: 09.07.2016 16:19:25
Re: Sed oder awk prüfe ob jede 6. Zeile leer ist
Eine Hausaufgabe hast du leider nicht gemacht da ich mit dem Studium schon fertig bin und gerade Urlaub habe (:
Ich arbeite gerade an einem Hobby Projekt um eine Internetseite zu filtern und awk / sed besser zu verstehen. Deine Lösung kann ich auch gut nachvollziehen, jedoch funktioniert diese noch nicht optimal. Ich habe dir mal einen Auszug meiner Beispieldaten eingefügt:
Gegeben:
benötigt:
Und das hier liefert deine Idee:
Der Fehler hat anscheinend etwas mit dem Zählen der Zeilen zu tun oder?
Ich arbeite gerade an einem Hobby Projekt um eine Internetseite zu filtern und awk / sed besser zu verstehen. Deine Lösung kann ich auch gut nachvollziehen, jedoch funktioniert diese noch nicht optimal. Ich habe dir mal einen Auszug meiner Beispieldaten eingefügt:
Gegeben:
Code: Alles auswählen
08:48
FLX 1350
Hamburg Hbf
09:03
08:57
IC 2212
Ostseebad Binz
09:09
Grund: Bauarbeiten
09:03
EC 9
Zürich HB
10:12
Grund: Feuerwehreinsatz auf der Strecke
Code: Alles auswählen
08:48
FLX 1350
Hamburg Hbf
09:03
----Hier muss die leere Zeile oder ein beliebiger String herein, da in dem Datensatz kein Grund angegeben wird-----
08:57
IC 2212
Ostseebad Binz
09:09
Grund: Bauarbeiten
09:03
EC 9
Zürich HB
10:12
Grund: Feuerwehreinsatz auf der Strecke
Und das hier liefert deine Idee:
Code: Alles auswählen
08:48
FLX 1350
Hamburg Hbf
09:03
---Hier wurde die gewünschte leere Zeile eingefügt----
08:57
IC 2212
Ostseebad Binz
09:09
Grund: Bauarbeiten
----Hier soll jedoch keine leere Zeile herein-----
09:03
EC 9
Zürich HB
10:12
Grund: Feuerwehreinsatz auf der Strecke
Re: Sed oder awk prüfe ob jede 6. Zeile leer ist
Ja, das ist ein Problem mit dem Zaehlen. Auch hatte hikaru recht, dass du nicht jede 6. Zeile pruefen willst, sondern den Input in Sechs-Zeichen-Bloecke auffuellen willst. Man muss also im Output zaehlen ... oder besser noch: jeweils einen Sechs-Zeilen-Abschnitt verarbeiten, diesen ggf. padden (d.h. eine Zeile einfuegen um ihn aufzufuellen) und dann wieder neu anfangen zu zaehlen. D.h. du musst eine Zaehlervariable einbauen, diese in jeder Zeile hochzaehlen und nach dem Padden zurueck auf Null setzen. Das waere der manuelle, imperative, C-artige Weg.
Wenn du nun speziell awk machen willst, dann koenntest du dort auch spezifische Features davon nutzen. Ich wuerde hier den Record-Separator (RS) auf die leere Zeile setzen, weil dein Input eigentlich aus jeweils 5-6-zeiligen Records besteht. Den Field-Separator kannst du dann auf den Zeilenumbruch setzen, dann ist jede Zeile in dem Record ein Field. Damit hast du dann in awk 3 Records mit je 5-6 Feldern. Die Pruefung, ob es ein sechstes Feld gibt ist damit einfach und du kannst einfach ein solches einfuegen. Das waere der awk-maessige Stil, dieses Problem zu loesen.
Wenn du nun speziell awk machen willst, dann koenntest du dort auch spezifische Features davon nutzen. Ich wuerde hier den Record-Separator (RS) auf die leere Zeile setzen, weil dein Input eigentlich aus jeweils 5-6-zeiligen Records besteht. Den Field-Separator kannst du dann auf den Zeilenumbruch setzen, dann ist jede Zeile in dem Record ein Field. Damit hast du dann in awk 3 Records mit je 5-6 Feldern. Die Pruefung, ob es ein sechstes Feld gibt ist damit einfach und du kannst einfach ein solches einfuegen. Das waere der awk-maessige Stil, dieses Problem zu loesen.
Use ed once in a while!
Re: Sed oder awk prüfe ob jede 6. Zeile leer ist
Ich würde hier eher einen kontextsensitiven Ansatz wählen, als einen Kontextfreien.
Du weißt, wie ein Record formal aussehen sollte:
Nun würde ich prüfen, ob die Records auch dem Format entsprechen und falls nicht, dieses nach Möglichkeit korrigieren. Du weißt z.B., dass nach der zweiten Uhrzeit-Zeile eines Records eine Zeile zu erwarten ist, die mit "Grund:" anfängt. Also würde ich auch genau dann eine solche Zeile einfügen, wenn ich nach der zweiten Uhrzeit-Zeile eines Records etwas Anderes als eine "Grund:"-Zeile finde (Leerzeile oder EOF).
In sed geht das meines Wissens nach nicht, in awk vermutlich schon. Aber da ich damit auf Kriegsfuß stehe, würde ich persönlich wohl eher ein bash-Script schreiben.
Du weißt, wie ein Record formal aussehen sollte:
Code: Alles auswählen
Leerzeile
Uhrzeit
Transportmittel
Ort
Uhrzeit
Grund
In sed geht das meines Wissens nach nicht, in awk vermutlich schon. Aber da ich damit auf Kriegsfuß stehe, würde ich persönlich wohl eher ein bash-Script schreiben.
-
- Beiträge: 7
- Registriert: 09.07.2016 16:19:25
Re: Sed oder awk prüfe ob jede 6. Zeile leer ist
Okay, dann versuche ich das mal mit einem bash Script erstmal selber. Trotzdem vielen Dank für eure Ideen. Die Zeile startet übrigens nicht immer mit Grund. Sicher ist aber, dass dort ansonsten immer ein Buchstabe zu erwarten ist.
Ich versuche es dann nochmal weiter, wenn ich etwas gefunden habe, kann ich es ja hier posten (;
Ich versuche es dann nochmal weiter, wenn ich etwas gefunden habe, kann ich es ja hier posten (;
Re: Sed oder awk prüfe ob jede 6. Zeile leer ist
Hier mein Vorschlag fuer den awk-artigen Weg, der so kompakt ist weil awk eben recordartig arbeitet und man dieses Problem recordartig verstehen kann:
Erlaeuterung:
Zuerst werden Record-Separator und Field-Separator plus ihre Output-Entsprechungen gesetzt, damit die Bloecke jeweils als ein Record begriffen werden, bei denen jede Zeile ein Field ist.
Anschliessend gibt es eine Regel, die bei vierfeldigen Records ein leeres fuenftes Feld einfuegt.
Die `1' am Ende ist eine Bedingung, die immer true ist und damit die Default-Aktion (= Ausgabe des Records) aufruft. Alternativ haette man statt der `1' auch `{print}' schreiben koennen.
Code: Alles auswählen
awk 'BEGIN{RS="";ORS="\n\n";FS=OFS="\n"} NF==4{$5=""} 1'
Zuerst werden Record-Separator und Field-Separator plus ihre Output-Entsprechungen gesetzt, damit die Bloecke jeweils als ein Record begriffen werden, bei denen jede Zeile ein Field ist.
Anschliessend gibt es eine Regel, die bei vierfeldigen Records ein leeres fuenftes Feld einfuegt.
Die `1' am Ende ist eine Bedingung, die immer true ist und damit die Default-Aktion (= Ausgabe des Records) aufruft. Alternativ haette man statt der `1' auch `{print}' schreiben koennen.
Use ed once in a while!
Re: Sed oder awk prüfe ob jede 6. Zeile leer ist
Wenn ich mir deine Beispieldaten anschaue (siehe Auszug unten), so scheinst du irgendwas mit Bahn-Daten machen zu wollen.Technikboy04 hat geschrieben:Ich arbeite gerade an einem Hobby Projekt um eine Internetseite zu filtern
Ich hoffe du versuchst nicht irgendwie die Bahn-Webseite zu analysieren.
Das geht nämlich wohl weit besser mit REST-APIs der Bahn und JSON-Objekte als Antwort.
Im Endeffekt macht es die Bahn-App auch nicht anders.
Vielleicht ist das ja was für dich. Leider weiß ich nicht, ob dabei Kosten anfallen.
Falls du deine Identität nicht angeben willst, mag die Webseite der Bahn wohl wirklich anonymer sein.
Aber vielleicht brauchst du auch nur eine E-Mail-Adresse.
https://developers.deutschebahn.com/db- ... /frontpage
Beispiel-Anwendung aus den APIs: https://map.railway-stations.org
Code: Alles auswählen
08:48 FLX 1350 Hamburg Hbf 09:03 08:57 IC 2212 Ostseebad Binz 09:09 Grund: Bauarbeiten