[gelöst]Textdateien bearbeiten via awk, python oder ...

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Alex0604
Beiträge: 7
Registriert: 15.02.2012 14:52:11

[gelöst]Textdateien bearbeiten via awk, python oder ...

Beitrag von Alex0604 » 15.02.2012 15:04:57

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
Zuletzt geändert von Alex0604 am 17.02.2012 08:01:23, insgesamt 2-mal geändert.

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: Textdateien via awk bearbeiten

Beitrag von syssi » 15.02.2012 20:10:12

Sind Zeilen, welche ein Flag besitzen 251 Zeichen breit?

Benutzeravatar
Livingston
Beiträge: 246
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz

Re: Textdateien via awk bearbeiten

Beitrag von Livingston » 15.02.2012 20:27:51

D.h. egal, was an Stelle 80 steht, darf ein "I" übergebraten bekommen? Dann:

Code: Alles auswählen

sed "s@\(.\{79\}\).\(.*\)@\1I\2@" <Dateiname>
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 8)

Benutzeravatar
Livingston
Beiträge: 246
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz

Re: Textdateien via awk bearbeiten

Beitrag von Livingston » 15.02.2012 21:26:59

Oder

Code: Alles auswählen

#!/bin/sh
cut -c -79 < Eingabedatei >> Ausgabedatei
echo "I" >> Ausgabedatei
cut -c 81- < Eingabedatei >> Ausgabedatei

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

Re: Textdateien via awk bearbeiten

Beitrag von Meillo » 16.02.2012 10:00:42

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 kommst du darauf, das mit awk machen zu wollen? Willst du das Problem geloest haben oder willst du unbedingt eine awk-Loesung haben?

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(1) once in a while!

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

Re: Textdateien via awk bearbeiten

Beitrag von uname » 16.02.2012 10:40:06

Vielleicht ist awk nicht geeignet. Aber es geht auch:

Code: Alles auswählen

awk '{OFS="";print substr($0,1,79),"I",substr($0,81,250)}' test.txt 
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.

yeti

Re: Textdateien via awk bearbeiten

Beitrag von yeti » 16.02.2012 11:59:40

@uname
Laß die "," schlicht weg:

Code: Alles auswählen

awk '{print substr($0,1,79) "I" substr($0,81,250)}' /etc/fstab

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

Re: Textdateien via awk bearbeiten

Beitrag von uname » 16.02.2012 12:03:41

Cool. Wieder was gelernt. Danke.

Alex0604
Beiträge: 7
Registriert: 15.02.2012 14:52:11

Re: Textdateien via awk bearbeiten

Beitrag von Alex0604 » 16.02.2012 19:22:02

Meillo hat geschrieben:
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 kommst du darauf, das mit awk machen zu wollen? Willst du das Problem geloest haben oder willst du unbedingt eine awk-Loesung haben?

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.
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...
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 :x, habe hier schon alles probiert utf8-15 etc nix klappt bin schon am verzweifeln...

Alex0604
Beiträge: 7
Registriert: 15.02.2012 14:52:11

Re: Textdateien via awk bearbeiten

Beitrag von Alex0604 » 16.02.2012 19:24:16

Livingston hat geschrieben:D.h. egal, was an Stelle 80 steht, darf ein "I" übergebraten bekommen? Dann:

Code: Alles auswählen

sed "s@\(.\{79\}\).\(.*\)@\1I\2@" <Dateiname>
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.

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 :cry:

\(.*\) -> 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 8)

Alex0604
Beiträge: 7
Registriert: 15.02.2012 14:52:11

Re: Textdateien via awk bearbeiten

Beitrag von Alex0604 » 16.02.2012 19:29:23

uname hat geschrieben:Vielleicht ist awk nicht geeignet. Aber es geht auch:

Code: Alles auswählen

awk '{OFS="";print substr($0,1,79),"I",substr($0,81,250)}' test.txt 
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.
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...
Vielleicht sollte ich auch einen neuen Thread aufmachen...

Alex0604
Beiträge: 7
Registriert: 15.02.2012 14:52:11

Re: Textdateien via awk bearbeiten

Beitrag von Alex0604 » 16.02.2012 19:35:30

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

Liffi
Beiträge: 2280
Registriert: 02.10.2004 01:33:05

Re: Textdateien via awk bearbeiten

Beitrag von Liffi » 17.02.2012 08:36:34

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.
Hier mal zwei Links, die dir eventuell beim Verständnis von Python und UTF8 weiterhelfen können:
http://wiki.python-forum.de/Von%20Umlau ... 0Encodings
http://wiki.python-forum.de/User%20Grou ... folien.pdf

Antworten