Sed oder awk prüfe ob jede 6. Zeile leer ist

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Technikboy04
Beiträge: 7
Registriert: 09.07.2016 16:19:25

Sed oder awk prüfe ob jede 6. Zeile leer ist

Beitrag von Technikboy04 » 08.08.2022 09:30:37

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?
Zuletzt geändert von Technikboy04 am 08.08.2022 09:39:51, insgesamt 4-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Sed or awk check every nth line and insert blank line

Beitrag von Meillo » 08.08.2022 09:33:21

Warum schreibst du uns denn auf Englisch? 8O
Use ed once in a while!

Technikboy04
Beiträge: 7
Registriert: 09.07.2016 16:19:25

Re: Sed or awk check every nth line and insert blank line

Beitrag von Technikboy04 » 08.08.2022 09:37:28

Hab ich mal schnell angepasst. Dachte das es evtl. mehr Sinn ergibt (:

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Sed or awk check every nth line and insert blank line

Beitrag von Meillo » 08.08.2022 09:43:19

Hier eine sehr kompakte Loesung:

Code: Alles auswählen

awk 'NR%6==0 && /^$/; 1'
Etwas ausfuehrlicher so:

Code: Alles auswählen

awk 'NR%6==0 && /^$/ {print ""} {print}'
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 ...
Use ed once in a while!

Benutzeravatar
hikaru
Moderator
Beiträge: 13559
Registriert: 09.04.2008 12:48:59

Re: Sed oder awk prüfe ob jede 6. Zeile leer ist

Beitrag von hikaru » 08.08.2022 09:46:45

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)?

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Sed oder awk prüfe ob jede 6. Zeile leer ist

Beitrag von Meillo » 08.08.2022 09:53:22

hikaru hat geschrieben: ↑ zum Beitrag ↑
08.08.2022 09:46:45
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)?
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.

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!

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: Sed oder awk prüfe ob jede 6. Zeile leer ist

Beitrag von MSfree » 08.08.2022 09:58:15

Technikboy04 hat geschrieben: ↑ zum Beitrag ↑
08.08.2022 09:30:37
ich brauche ein sed or awk
Die Länger einer Zeile läßt sich mit awk mit

Code: Alles auswählen

length($0)
ermitteln. Die Zeilennummer kann man in einer Variable mitzählen. Ein "magisches" if, das Zeilennummer und Zeilenlänger vergleicht und dann eine leere Zeile ausgibt, ist kein Hexenwerk.
Befehl um jede 6. Zeile zu überprüfen, ob diese leer ist. Wenn dies so ist, soll eine weitere leere Zeile eingefügt werden.
Was soll passieren, wenn zwischendurch die sechste Zeile mal nicht leer ist?

Technikboy04
Beiträge: 7
Registriert: 09.07.2016 16:19:25

Re: Sed oder awk prüfe ob jede 6. Zeile leer ist

Beitrag von Technikboy04 » 08.08.2022 10:02:25

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:

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
benötigt:

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
Der Fehler hat anscheinend etwas mit dem Zählen der Zeilen zu tun oder?

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Sed oder awk prüfe ob jede 6. Zeile leer ist

Beitrag von Meillo » 08.08.2022 10:28:16

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.
Use ed once in a while!

Benutzeravatar
hikaru
Moderator
Beiträge: 13559
Registriert: 09.04.2008 12:48:59

Re: Sed oder awk prüfe ob jede 6. Zeile leer ist

Beitrag von hikaru » 08.08.2022 10:52:13

Ich würde hier eher einen kontextsensitiven Ansatz wählen, als einen Kontextfreien.
Du weißt, wie ein Record formal aussehen sollte:

Code: Alles auswählen

Leerzeile
Uhrzeit
Transportmittel
Ort
Uhrzeit
Grund
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.

Technikboy04
Beiträge: 7
Registriert: 09.07.2016 16:19:25

Re: Sed oder awk prüfe ob jede 6. Zeile leer ist

Beitrag von Technikboy04 » 08.08.2022 10:57:33

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 (;

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Sed oder awk prüfe ob jede 6. Zeile leer ist

Beitrag von Meillo » 08.08.2022 11:20:52

Hier mein Vorschlag fuer den awk-artigen Weg, der so kompakt ist weil awk eben recordartig arbeitet und man dieses Problem recordartig verstehen kann:

Code: Alles auswählen

awk 'BEGIN{RS="";ORS="\n\n";FS=OFS="\n"} NF==4{$5=""} 1'
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.
Use ed once in a while!

uname
Beiträge: 12046
Registriert: 03.06.2008 09:33:02

Re: Sed oder awk prüfe ob jede 6. Zeile leer ist

Beitrag von uname » 08.08.2022 11:41:55

Technikboy04 hat geschrieben:Ich arbeite gerade an einem Hobby Projekt um eine Internetseite zu filtern
Wenn ich mir deine Beispieldaten anschaue (siehe Auszug unten), so scheinst du irgendwas mit Bahn-Daten machen zu wollen.
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

Antworten