Bash 3 Text Dateien zu einer Gesamtdatei zusammenfügen mit Absätzen

pegel

Cadet 1st Year
Registriert
März 2023
Beiträge
11
Hallo liebe Programmierer, ich habe auf meinem Linux Rechner im /tmp Verzeichnis 3 Dateien mit folgenden Namen:

pegelwarnaltenahr.txt
pegelwarnkreuzberg.txt
pegelwarnmuesch.txt

pegelwarnaltenahr.txt zeigt folgenden Inhalt:

Sie hören den Wasserstand der Ahr, gemessen am Pegel Altenahr:,
Letzter Messwert: 01.03.2023 16:30 Uhr,
59 cm < Mittelwasser

pegelwarnkreuzberg.txt zeigt folgenden Inhalt:

Sie hören den Wasserstand des Sahrbaches, gemessen am Pegel Kreuzberg:,
Letzter Messwert: 01.03.2023 16:30 Uhr,
30 cm kein Kennwert vorhanden

pegelwarnmuesch.txt zeigt folgenden Inhalt:

Sie hören den Wasserstand der Ahr, gemessen am Pegel Müsch 2:,
Letzter Messwert: 01.03.2023 16:30 Uhr,
28 cm kein Kennwert vorhanden

Was möchte ich erreichen.

Ich möchte alle drei Textdateien schön geordnet untereinander gelistet in einer textdatei zum Beispiel (pegelgesamt.txt) zusammen fügen.

Was habe ich selber schon probiert:

cat pegelwarnaltenahr.txt pegelwarnkreuzberg.txt pegelwarnmuesch.txt>alle.txt
cat pegelwarnaltenahr.txt pegelwarnkreuzberg.txt pegelwarnmuesch.txt>>alle.txt

Diverse Sort und cut Befehle habe mich nicht weiter gebracht.

kommt leider alles unsortiert und mit schlechtem format heraus wie in diesem Beispiel von alle.txt

Sie hören den Wasserstand der Ahr, gemessen am Pegel Altenahr:,
Letzter Messwert: 01.03.2023 14:15 Uhr,
60 cm < MittelwasserSie hören den Wasserstand des Sahrbaches, gemessen am Pegel Kreuzberg:,
Letzter Messwert: 01.03.2023 14:00 Uhr,
30 cm kein Kennwert vorhandenSie hören den Wasserstand der Ahr, gemessen am Pegel Müsch 2:,
Letzter Messwert: 01.03.2023 14:00 Uhr,
28 cm kein Kennwert vorhandenSie hören den Wasserstand der Ahr, gemessen am Pegel Altenahr:,
Letzter Messwert: 01.03.2023 14:15 Uhr,
60 cm < MittelwasserSie hören den Wasserstand des Sahrbaches, gemessen am Pegel Kreuzberg:,
Letzter Messwert: 01.03.2023 14:15 Uhr,
31 cm kein Kennwert vorhandenSie hören den Wasserstand der Ahr, gemessen am Pegel Müsch 2:,
Letzter Messwert: 01.03.2023 14:00 Uhr,
28 cm kein Kennwert vorhandenSie hören den Wasserstand der Ahr, gemessen am Pegel Altenahr:,
Letzter Messwert: 01.03.2023 14:30 Uhr,
59 cm < MittelwasserSie hören den Wasserstand des Sahrbaches, gemessen am Pegel Kreuzberg:,
Letzter Messwert: 01.03.2023 14:30 Uhr,
31 cm kein Kennwert vorhandenSie hören den Wasserstand der Ahr, gemessen am Pegel Müsch 2:,
Letzter Messwert: 01.03.2023 14:30 Uhr,
28 cm kein Kennwert vorhanden

Auf dem Linux PC ist auch python 3.8 installiert, ich habe aber leider nur sehr wenig Ahnung, Vielleicht hat jemand eine Idee.

Vielen Dank für unkomplizierte Hilfe.
 
Zuletzt bearbeitet:
Von wo kommen die Dateien?

Probiere mal vorher die Dateien mit DOS2UNIX zu wandeln und dann mit cat zusammen zu setzen.
 
bloede frag, aber:
warum baust du nicht einen exporter, mit dem du elwis oder andere quellen scrapen kannst? Dann kann man die daten gleich schon in eine datenbank schreiben und dashboards zusammen klicken

beispiel;
https://grafana.com/grafana/plugins/natel-usgs-datasource/

dann ists gleich niceund du musst pro stadt nur eine zeile im scraper hinzufuegen
Ergänzung ()

nevermind
gibt sogar schon eine rest api um so daten zu sammeln
https://pegelonline.wsv.de/webservice/dokuRestapi
das macht dsa ganze noch leichter

was hast du mit den daten vor?

und um auf die urspungsfrage zu kommen:
wonach willst du den inhalt sortieren

sosnt geht das auch so:
cat $(ls -t) > outputfile
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: andy_m4
Spottdrossel schrieb:
Diese Dinge habe ich schon versucht \r\n usw.
Ergänzung ()

BFF schrieb:
Ja das werde ich machen, ich habe die Dateien von einer Webseite ausgelesen, sie liegen leider auch nur so in dem Format vor.
Ergänzung ()

pegel schrieb:
Ich habe die schon bearbeitet und lasse ein Script drüber laufen um sie zu verändern mit sed:

sed -i 's/Wasserstand am Pegel Altenahr/Sie hören den Wasserstand der Ahr, gemessen am Pegel Altenahr:,/g' /tmp/pegelwarnaltenahr.txt
sed -i 's/Wasserstand am Pegel Kreuzberg/Sie hören den Wasserstand des Sahrbaches, gemessen am Pegel Kreuzberg:,/g' /tmp/pegelwarnkreuzberg.txt
sed -i 's/Wasserstand am Pegel Müsch 2/Sie hören den Wasserstand der Ahr, gemessen am Pegel Müsch 2:,/g' /tmp/pegelwarnmuesch.txt

Es ist ein Amateurfunk Projekt und dient zur Warnung im Ahrtal, die Dateien werden in Sounddateien umgewandelt und über Funk ausgestrahlt.
Ergänzung ()

madmax2010 schrieb:
Die Daten werden in eine Sounddatei umgewandelt und über Funk verbreitet. Klasse der Link von WSV wusste ich garnicht.
 
Zuletzt bearbeitet von einem Moderator:
pegel schrieb:
kommt leider alles unsortiert und mit schlechtem format heraus wie in diesem Beispiel von alle.txt
Unsortiert ist das in meinen Augen nicht. Die Sequenz Altenahr, Kreuzberg, Müsch 2 wird doch einwandfrei wiederholt?

Was das Format angeht: Klar, cat und > bzw. >> fügt den Output einfach aneinander. Das Problem ist, dass die Dateien jeweils auf dem letzten Zeichen enden und kein abschließendes \n haben. Deswegen wird die Folgedatei auch direkt im Anschluss an "Kennwort vorhanden" in derselben Zeile angehängt.

Ohne es gerade testen zu können, versuch mal folgendes:

cat altenahr.txt <(echo) kreuzberg.txt <(echo) muesch.txt > alle.txt

(ist zugegebenermaßen ein google-fund)
 
  • Gefällt mir
Reaktionen: Pummeluff und madmax2010
Ja super, das mache ich mal sofort...melde mich wieder.
 
Wenn sich das notwendige Zeichen zum Zeilenwechsel nicht separat einfügen lässt, erstelle eine Textdatei (leerzeilen.txt) die nur zwei leere Zeilen enthält und füge sie dazwischen:

Code:
cat pegelwarnaltenahr.txt leerzeilen.txt pegelwarnkreuzberg.txt leerzeilen.txt pegelwarnmuesch.txt>alle.txt
 
  • Gefällt mir
Reaktionen: kuddlmuddl und pegel
Raijin schrieb:
cat altenahr.txt <(echo) kreuzberg.txt <(echo) muesch.txt > alle.txt
:/tmp$ cat pegelwarnaltenahr.txt <(echo) pegelwarnkreuzberg.txt <(echo)pegelwarnmuesch.txt > alle.txt
cat: /dev/fd/62pegelwarnmuesch.txt: Datei oder Verzeichnis nicht gefunden
 
da fehlt ein leerzeichen

Bash:
falsch:
cat pegelwarnaltenahr.txt <(echo) pegelwarnkreuzberg.txt <(echo)pegelwarnmuesch.txt > alle.txt
korrekt:
cat pegelwarnaltenahr.txt <(echo) pegelwarnkreuzberg.txt <(echo) pegelwarnmuesch.txt > alle.txt
 
  • Gefällt mir
Reaktionen: pegel
Incanus schrieb:
Wenn sich das notwendige Zeichen zum Zeilenwechsel nicht separat einfügen lässt, erstelle eine Textdatei (leerzeilen.txt) die nur zwei leere Zeilen enthält und füge sie dazwischen:

Code:
cat pegelwarnaltenahr.txt leerzeilen.txt pegelwarnkreuzberg.txt leerzeilen.txt pegelwarnmuesch.txt>alle.txt
Perfekt das ist die richtige Lösung...Prima Danke

Ergebnis:

Sie hören den Wasserstand der Ahr, gemessen am Pegel Altenahr:,
Letzter Messwert: 01.03.2023 17:15 Uhr,
59 cm < Mittelwasser

Sie hören den Wasserstand des Sahrbaches, gemessen am Pegel Kreuzberg:,
Letzter Messwert: 01.03.2023 17:15 Uhr,
30 cm kein Kennwert vorhanden

Sie hören den Wasserstand der Ahr, gemessen am Pegel Müsch 2:,
Letzter Messwert: 01.03.2023 17:15 Uhr,
29 cm kein Kennwert vorhanden
 
willst du das in einem script skalierbarer haben? damit du nicht immer die dateinamen tippen musst?
 
madmax2010 schrieb:
da fehlt ein leerzeichen

Bash:
falsch:
cat pegelwarnaltenahr.txt <(echo) pegelwarnkreuzberg.txt <(echo)pegelwarnmuesch.txt > alle.txt
korrekt:
cat pegelwarnaltenahr.txt <(echo) pegelwarnkreuzberg.txt <(echo) pegelwarnmuesch.txt > alle.txt
Hallo, habe die Lösung von Incanus auch probiert:

Ergebnis:

Sie hören den Wasserstand der Ahr, gemessen am Pegel Altenahr:,
Letzter Messwert: 01.03.2023 17:15 Uhr,
59 cm < Mittelwasser

Sie hören den Wasserstand des Sahrbaches, gemessen am Pegel Kreuzberg:,
Letzter Messwert: 01.03.2023 17:15 Uhr,
30 cm kein Kennwert vorhanden

Sie hören den Wasserstand der Ahr, gemessen am Pegel Müsch 2:,
Letzter Messwert: 01.03.2023 17:15 Uhr,
29 cm kein Kennwert vorhanden
madmax2010 schrieb:
da fehlt ein leerzeichen

Bash:
falsch:
cat pegelwarnaltenahr.txt <(echo) pegelwarnkreuzberg.txt <(echo)pegelwarnmuesch.txt > alle.txt
korrekt:
cat pegelwarnaltenahr.txt <(echo) pegelwarnkreuzberg.txt <(echo) pegelwarnmuesch.txt > alle.txt

Ja da hast du Recht, Icanus hat eine Lösung die finktioniert:

Vielen Dank für die Hilfe:

Ergebnis:

Sie hören den Wasserstand der Ahr, gemessen am Pegel Altenahr:,
Letzter Messwert: 01.03.2023 17:15 Uhr,
59 cm < Mittelwasser

Sie hören den Wasserstand des Sahrbaches, gemessen am Pegel Kreuzberg:,
Letzter Messwert: 01.03.2023 17:15 Uhr,
30 cm kein Kennwert vorhanden

Sie hören den Wasserstand der Ahr, gemessen am Pegel Müsch 2:,
Letzter Messwert: 01.03.2023 17:15 Uhr,
29 cm kein Kennwert vorhanden
Ergänzung ()

madmax2010 schrieb:
da fehlt ein leerzeichen

Bash:
falsch:
cat pegelwarnaltenahr.txt <(echo) pegelwarnkreuzberg.txt <(echo)pegelwarnmuesch.txt > alle.txt
korrekt:
cat pegelwarnaltenahr.txt <(echo) pegelwarnkreuzberg.txt <(echo) pegelwarnmuesch.txt > alle.txt
Klasse auch das funktioniert:
Ergänzung ()

madmax2010 schrieb:
willst du das in einem script skalierbarer haben? damit du nicht immer die dateinamen tippen musst?
Ja sehr gerne wenn das kein großer Aufwand ist..sehr gerne.
 
Zuletzt bearbeitet:
bitte nicht immer vollzitate..

aber schau mal hier:

Bash:
SCRIPTPATH="/tmp"
OUTNAME=alle_pegel.txt

rm $SCRIPTPATH/$OUTNAME
for f in $SCRIPTPATH/pegel*.txt
do
    echo $f' wird gelesen'
    cat $f >>  $SCRIPTPATH/$OUTNAME
    echo -en '\n' >>  $SCRIPTPATH/$OUTNAME
done
echo $SCRIPTPATH/$OUTNAME" wurde mit dem Inhalt der oben gelisteten Dateien geschrieben"

alle dateien die in SCRIPTPATH liegen (hier auf /tmp gestellt) die mit pegel anfangen und mit txt aufhoeren, werden mit leerzeilen dazwischen in eine datei geschrieben

speicher es dir als script ab und du hast was du brauchst

wenn du fragen zu zeilen hast sag
achtung: die alte Datei löscht er gerade, damit sie nicht bei jedem Durchlauf immer länger wird.
Sollen die Dateien mit Datum versehen werden?
Ergänzung ()

pegel schrieb:
Ja sehr gerne wenn das kein großer Aufwand ist..sehr gerne.
naja, was du brauchst wissen wir schon. ueber dateien iterieren habe ich in ca 70% meiner bash skripte. Das war praktisch schon fertig
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: kuddlmuddl, pegel und Raijin
Wow das ist perfekt, kannst ich dich auch mal per Mail anschreiben?? Ja sehr gerne mit Datum
Ergänzung ()

madmax2010 schrieb:
Da kommt leider ein Fehler:
./pegel.sh: /bin/bash^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden
-bash: ./pegel.sh:: Datei oder Verzeichnis nicht gefunden

#!/bin/bash
SCRIPTPATH="/tmp"
OUTNAME=alle_pegel.txt

rm $SCRIPTPATH/$OUTNAME
for f in $SCRIPTPATH/pegel*.txt
do
echo $f' wird gelesen'
cat $f >> $SCRIPTPATH/$OUTNAME
echo -en '\n' >> $SCRIPTPATH/$OUTNAME
done
echo $SCRIPTPATH/$OUTNAME" wurde mit dem Inhalt der oben gelisteten Dateien geschrieben"
 
Zuletzt bearbeitet von einem Moderator:
mach einfach
sh pegel.sh
die shebang line braucht es nicht mach mal, aber mach mal which bash , dann siehst du welche shell du geladen hast. vermutlich /usr/bin/bash
Das ergebnis dann oben rein
Ergänzung ()

hmm
an das denkend, was @BFF oben sagt: welchen editor hast du genutzt?
try:
sed -i -e 's/\r$//' pegel.sh
und dann laufen lassen. Wenn das nicht reicht:
sed -i -e 's/^M$//' pegel.sh

wenn all das nicht geht.. meh
 
pegel schrieb:
Wow das ist perfekt, kannst ich dich auch mal per Mail anschreiben?? Ja sehr gerne mit Datum
Ergänzung ()


Da kommt leider ein Fehler:
./pegel.sh: /bin/bash^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden
-bash: ./pegel.sh:: Datei oder Verzeichnis nicht gefunden

#!/bin/bash
SCRIPTPATH="/tmp"
OUTNAME=alle_pegel.txt

rm $SCRIPTPATH/$OUTNAME
for f in $SCRIPTPATH/pegel*.txt
do
echo $f' wird gelesen'
cat $f >> $SCRIPTPATH/$OUTNAME
echo -en '\n' >> $SCRIPTPATH/$OUTNAME
done
echo $SCRIPTPATH/$OUTNAME" wurde mit dem Inhalt der oben gelisteten Dateien geschrieben"
: not found:
rm: das Entfernen von '/tmp'$'\r''/alle_pegel.txt'$'\r\r' ist nicht möglich: Datei oder Verzeichnis nicht gefunden
pegel.sh: 7: Syntax error: word unexpected (expecting "do")
 
Zuletzt bearbeitet:
pegel schrieb:
amaterufunk detected

pegel schrieb:
: not found:
rm: das Entfernen von '/tmp'$'\r''/alle_pegel.txt'$'\r\r' ist nicht möglich: Datei oder Verzeichnis nicht gefunden
pegel.sh: 7: Syntax error: word unexpected (expecting "do")
gegen das scrpt laufen lassen - was von den DIngen oben hast du wie ausgefuehert? nur die ausgabe ist nicht unbedingt hilfreich

ich muss noch ein wenig arbeiten, schaue nachher nochmal rein
 
ne, das ersetzt ueberfluessige steuerzeichen, wenn du datei bspw. unter windows editiert wurde
 
Zurück
Oben