[gelöst]Textdateien bearbeiten via awk, python oder ...
[gelöst]Textdateien bearbeiten via awk, python oder ...
Hallo in die Runde,
bin vollkommen unbedarft was awk skripte anbelangt und stehe vor folgendem Problem:
Ich habe eine Textdatei mit einer festen breite 250, nun will ich nachdem ich die Datei in eine Datenbank einglesen habe via awk bearbeiten und an der festen Stelle 80 ein Flag beispielsweise I(für importiert setzen lassen, da die Textdatei immer wieder befüllt wird und neuer Inhalt angefügt wird). Falls an Stelle 80 schon eine Ziffer oder Character steht soll dieser Überschrieben werden:
Die Ursprungsdatei sieht so aus:
114077720120170029820170 201201 01900
114077720120270029820173 201202 06250
Die awk bearbeitete Datei soll so aussehen:
114077720120170029820170 201201 I01900
114077720120270029820173 201202 I06250
Bin für jede Hilfe dankbar.
Viele Grüße
Alex
bin vollkommen unbedarft was awk skripte anbelangt und stehe vor folgendem Problem:
Ich habe eine Textdatei mit einer festen breite 250, nun will ich nachdem ich die Datei in eine Datenbank einglesen habe via awk bearbeiten und an der festen Stelle 80 ein Flag beispielsweise I(für importiert setzen lassen, da die Textdatei immer wieder befüllt wird und neuer Inhalt angefügt wird). Falls an Stelle 80 schon eine Ziffer oder Character steht soll dieser Überschrieben werden:
Die Ursprungsdatei sieht so aus:
114077720120170029820170 201201 01900
114077720120270029820173 201202 06250
Die awk bearbeitete Datei soll so aussehen:
114077720120170029820170 201201 I01900
114077720120270029820173 201202 I06250
Bin für jede Hilfe dankbar.
Viele Grüße
Alex
Zuletzt geändert von Alex0604 am 17.02.2012 08:01:23, insgesamt 2-mal geändert.
-
- Beiträge: 2951
- Registriert: 24.12.2010 16:50:59
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Rheinland
Re: Textdateien via awk bearbeiten
Sind Zeilen, welche ein Flag besitzen 251 Zeichen breit?
- Livingston
- Beiträge: 1816
- Registriert: 04.02.2007 22:52:25
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: 127.0.0.1
Re: Textdateien via awk bearbeiten
D.h. egal, was an Stelle 80 steht, darf ein "I" übergebraten bekommen? Dann:
Zugegeben, es ist nicht awk, aber es klappt.
Übersetzung:
s -> sed-Kommando für Ersetzen
@ -> selbst gewähltes Trennzeichen für die Felder des Kommandos s
. -> beliebiges Zeichen
.\{79\} -> genau 79 beliebige Zeichen
wird gruppiert zu:
\(.\{79\}\) -> 79 beliebige Zeichen in einem Teilausdruck
. -> Es folgt ein weiteres beliebiges Zeichen, nämlich das 80.
\(.*\) -> Ein weiterer Teilausdruck, der beliebig viele beliebige Zeichen enthält, nämlich bis zum Ende der Zeile
Dieser Pladderadatsch wird nach dem Trenner @ ersetzt durch:
\1I\2 -> d.h. Teilausdruck1 gefolgt von I und Teilausdruck2
Abschließend noch mal das Trennzeichen @ und ... fertig
Code: Alles auswählen
sed "s@\(.\{79\}\).\(.*\)@\1I\2@" <Dateiname>
Übersetzung:
s -> sed-Kommando für Ersetzen
@ -> selbst gewähltes Trennzeichen für die Felder des Kommandos s
. -> beliebiges Zeichen
.\{79\} -> genau 79 beliebige Zeichen
wird gruppiert zu:
\(.\{79\}\) -> 79 beliebige Zeichen in einem Teilausdruck
. -> Es folgt ein weiteres beliebiges Zeichen, nämlich das 80.
\(.*\) -> Ein weiterer Teilausdruck, der beliebig viele beliebige Zeichen enthält, nämlich bis zum Ende der Zeile
Dieser Pladderadatsch wird nach dem Trenner @ ersetzt durch:
\1I\2 -> d.h. Teilausdruck1 gefolgt von I und Teilausdruck2
Abschließend noch mal das Trennzeichen @ und ... fertig
- Livingston
- Beiträge: 1816
- Registriert: 04.02.2007 22:52:25
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: 127.0.0.1
Re: Textdateien via awk bearbeiten
Oder
Code: Alles auswählen
#!/bin/sh
cut -c -79 < Eingabedatei >> Ausgabedatei
echo "I" >> Ausgabedatei
cut -c 81- < Eingabedatei >> Ausgabedatei
Re: Textdateien via awk bearbeiten
Wie kommst du darauf, das mit awk machen zu wollen? Willst du das Problem geloest haben oder willst du unbedingt eine awk-Loesung haben?Alex0604 hat geschrieben: Ich habe eine Textdatei mit einer festen breite 250, nun will ich nachdem ich die Datei in eine Datenbank einglesen habe via awk bearbeiten und an der festen Stelle 80 ein Flag beispielsweise I(für importiert setzen lassen, da die Textdatei immer wieder befüllt wird und neuer Inhalt angefügt wird). Falls an Stelle 80 schon eine Ziffer oder Character steht soll dieser Überschrieben werden:
Wie du an den bisherigen Antworten schon erkennen kannst, passt awk zu diesem Problem gar nicht. Es ist nicht das richtige Werkzeug um dieses Problem zu loesen.
Geht es dir um das Problem, dann war es ein Fehler mit deiner Nennung von awk die moeglichen Loesungen einzuschraenken. Geht es dir aber um awk, dann ist das Datenformat schlecht gewaehlt. In ersterem Fall solltest du den Begriff ``awk'' aus der Frage eliminieren, im zweiteren Fall solltest du deine Daten konvertieren.
Use ed once in a while!
Re: Textdateien via awk bearbeiten
Vielleicht ist awk nicht geeignet. Aber es geht auch:
Bisschen doof ist vielleicht das Trennzeichen bei "print" mit einem Leerzeichen, welches man mit OFS entsprechend neu setzen muss (auf kein Leerzeichen). Leider kenn ich mich mit awk nicht wirklich aus. Aber ich nutze jede Chance es zu lernen. Aber sed scheint wirklich geeigneter bei dem Beispiel zu sein.
Code: Alles auswählen
awk '{OFS="";print substr($0,1,79),"I",substr($0,81,250)}' test.txt
Re: Textdateien via awk bearbeiten
@uname
Laß die "," schlicht weg:
Laß die "," schlicht weg:
Code: Alles auswählen
awk '{print substr($0,1,79) "I" substr($0,81,250)}' /etc/fstab
Re: Textdateien via awk bearbeiten
Cool. Wieder was gelernt. Danke.
Re: Textdateien via awk bearbeiten
Nein mir geht es nicht um awk, lediglich um die Lösung des Problems, die awk Lösung fällt jetzt auch erstmal weg, da ich das skript nicht aus meinem externen Programm aufrufen kann...Meillo hat geschrieben:Wie kommst du darauf, das mit awk machen zu wollen? Willst du das Problem geloest haben oder willst du unbedingt eine awk-Loesung haben?Alex0604 hat geschrieben: Ich habe eine Textdatei mit einer festen breite 250, nun will ich nachdem ich die Datei in eine Datenbank einglesen habe via awk bearbeiten und an der festen Stelle 80 ein Flag beispielsweise I(für importiert setzen lassen, da die Textdatei immer wieder befüllt wird und neuer Inhalt angefügt wird). Falls an Stelle 80 schon eine Ziffer oder Character steht soll dieser Überschrieben werden:
Wie du an den bisherigen Antworten schon erkennen kannst, passt awk zu diesem Problem gar nicht. Es ist nicht das richtige Werkzeug um dieses Problem zu loesen.
Geht es dir um das Problem, dann war es ein Fehler mit deiner Nennung von awk die moeglichen Loesungen einzuschraenken. Geht es dir aber um awk, dann ist das Datenformat schlecht gewaehlt. In ersterem Fall solltest du den Begriff ``awk'' aus der Frage eliminieren, im zweiteren Fall solltest du deine Daten konvertieren.
jetzt hab ich es mit einem python skript versucht das funktioniert beim setzen von "L" an der 80 Stelle wunderbar jedoch hab ich noch eine 2.te Datei bei der an stelle 172-176 "0090ü" gesetzt werden muss und hier streikt mein Python da er Probleme mit dem Decoding des Umlauts hat , habe hier schon alles probiert utf8-15 etc nix klappt bin schon am verzweifeln...
Re: Textdateien via awk bearbeiten
Livingston hat geschrieben:D.h. egal, was an Stelle 80 steht, darf ein "I" übergebraten bekommen? Dann:Zugegeben, es ist nicht awk, aber es klappt.Code: Alles auswählen
sed "s@\(.\{79\}\).\(.*\)@\1I\2@" <Dateiname>
Übersetzung:
s -> sed-Kommando für Ersetzen
@ -> selbst gewähltes Trennzeichen für die Felder des Kommandos s
. -> beliebiges Zeichen
.\{79\} -> genau 79 beliebige Zeichen
wird gruppiert zu:
\(.\{79\}\) -> 79 beliebige Zeichen in einem Teilausdruck
. -> Es folgt ein weiteres beliebiges Zeichen, nämlich das 80.
Danke für die Hilfe wie unten geschildert, fällt awk jetzt leider flach da ich es aus nicht aus dem nachverarbeitungsprogramm aufrufen kann leider
\(.*\) -> Ein weiterer Teilausdruck, der beliebig viele beliebige Zeichen enthält, nämlich bis zum Ende der Zeile
Dieser Pladderadatsch wird nach dem Trenner @ ersetzt durch:
\1I\2 -> d.h. Teilausdruck1 gefolgt von I und Teilausdruck2
Abschließend noch mal das Trennzeichen @ und ... fertig
Re: Textdateien via awk bearbeiten
Auch hier ein Dank an den Verfasser, diesen Weg haben wir dann nach viel probieren auch gewählt, aber wie sich jetzt herausstellt scheint python hier für uns die besser Lösung zu sein, aber das stellt uns vor eine neue Herausforderung wie stelle ich via Python sicher das "ÜÄÖ" etc dargestellt werden...uname hat geschrieben:Vielleicht ist awk nicht geeignet. Aber es geht auch:Bisschen doof ist vielleicht das Trennzeichen bei "print" mit einem Leerzeichen, welches man mit OFS entsprechend neu setzen muss (auf kein Leerzeichen). Leider kenn ich mich mit awk nicht wirklich aus. Aber ich nutze jede Chance es zu lernen. Aber sed scheint wirklich geeigneter bei dem Beispiel zu sein.Code: Alles auswählen
awk '{OFS="";print substr($0,1,79),"I",substr($0,81,250)}' test.txt
Vielleicht sollte ich auch einen neuen Thread aufmachen...
Re: Textdateien via awk bearbeiten
Hi @ All Helpers,
die Möglichkeit das Thema via awk zu lösen, ist leider nicht möglich, da sich das Skript zwar über das .cmd aufrufen laässt aber das externe Programm keinen Aufruf des AWK Skripts zulässt, daher jetzt der Versuch mit python und hier stellt sich schon wieder eine Hürde, da python Probleme mit Umlauten hat, hat jemand eine Idee wie ich das encoding in einem python skript ansteuere damit es UTF8 fähig ist.
Bin weiterhin für jede Hilfe dankbar und danke allen die sich bereits des Themas angenommen haben.
Gruß
Alex
die Möglichkeit das Thema via awk zu lösen, ist leider nicht möglich, da sich das Skript zwar über das .cmd aufrufen laässt aber das externe Programm keinen Aufruf des AWK Skripts zulässt, daher jetzt der Versuch mit python und hier stellt sich schon wieder eine Hürde, da python Probleme mit Umlauten hat, hat jemand eine Idee wie ich das encoding in einem python skript ansteuere damit es UTF8 fähig ist.
Bin weiterhin für jede Hilfe dankbar und danke allen die sich bereits des Themas angenommen haben.
Gruß
Alex
Re: Textdateien via awk bearbeiten
Hier mal zwei Links, die dir eventuell beim Verständnis von Python und UTF8 weiterhelfen können:Alex0604 hat geschrieben:daher jetzt der Versuch mit python und hier stellt sich schon wieder eine Hürde, da python Probleme mit Umlauten hat, hat jemand eine Idee wie ich das encoding in einem python skript ansteuere damit es UTF8 fähig ist.
http://wiki.python-forum.de/Von%20Umlau ... 0Encodings
http://wiki.python-forum.de/User%20Grou ... folien.pdf