zur Navigation

debianforum.de

die deutschsprachige Supportwebseite rund um das Debian-Projekt

Zum Inhalt


 
 
 
  • Foren-Übersicht ‹ Fortgeschrittene Themen ‹ Softwareentwicklung und -paketierung, Scripting

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

Antwort erstellen
13 Beiträge • Seite 1 von 1

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

Beitragvon Alex0604 am 15.02.2012 16: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 09:01:23, insgesamt 2-mal geändert.
Alex0604
 
Beiträge: 7
Registriert: 15.02.2012 15:52:11
Nach oben

Re: Textdateien via awk bearbeiten

Beitragvon syssi am 15.02.2012 21:10:12

Sind Zeilen, welche ein Flag besitzen 251 Zeichen breit?
syssi
 
Beiträge: 2102
Registriert: 24.12.2010 17:50:59
Wohnort: Dänemark
Lizenz eigener Beiträge: MIT Lizenz
Nach oben

Re: Textdateien via awk bearbeiten

Beitragvon Livingston am 15.02.2012 21: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: 133
Registriert: 04.02.2007 23:52:25
Lizenz eigener Beiträge: MIT Lizenz
Nach oben

Re: Textdateien via awk bearbeiten

Beitragvon Livingston am 15.02.2012 22:26:59

Oder
Code: Alles auswählen
#!/bin/sh
cut -c -79 < Eingabedatei >> Ausgabedatei
echo "I" >> Ausgabedatei
cut -c 81- < Eingabedatei >> Ausgabedatei
Benutzeravatar
Livingston
 
Beiträge: 133
Registriert: 04.02.2007 23:52:25
Lizenz eigener Beiträge: MIT Lizenz
Nach oben

Re: Textdateien via awk bearbeiten

Beitragvon Meillo am 16.02.2012 11: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!
Benutzeravatar
Meillo
Moderator
 
Beiträge: 3088
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
  • Website
Nach oben

Re: Textdateien via awk bearbeiten

Beitragvon uname am 16.02.2012 11: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.
uname
 
Beiträge: 4560
Registriert: 03.06.2008 09:33:02
Nach oben

Re: Textdateien via awk bearbeiten

Beitragvon yeti am 16.02.2012 12:59:40

@uname
Laß die "," schlicht weg:
Code: Alles auswählen
awk '{print substr($0,1,79) "I" substr($0,81,250)}' /etc/fstab
yeti
 
Nach oben

Re: Textdateien via awk bearbeiten

Beitragvon uname am 16.02.2012 13:03:41

Cool. Wieder was gelernt. Danke.
uname
 
Beiträge: 4560
Registriert: 03.06.2008 09:33:02
Nach oben

Re: Textdateien via awk bearbeiten

Beitragvon Alex0604 am 16.02.2012 20: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 15:52:11
Nach oben

Re: Textdateien via awk bearbeiten

Beitragvon Alex0604 am 16.02.2012 20: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 15:52:11
Nach oben

Re: Textdateien via awk bearbeiten

Beitragvon Alex0604 am 16.02.2012 20: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 15:52:11
Nach oben

Re: Textdateien via awk bearbeiten

Beitragvon Alex0604 am 16.02.2012 20: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
Alex0604
 
Beiträge: 7
Registriert: 15.02.2012 15:52:11
Nach oben

Re: Textdateien via awk bearbeiten

Beitragvon Liffi am 17.02.2012 09: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%20Umlauten%2C%20Unicode%20und%20Encodings
http://wiki.python-forum.de/User%20Group%20M%C3%BCnchen?action=AttachFile&do=view&target=unicode-folien.pdf
Liffi
 
Beiträge: 1706
Registriert: 02.10.2004 01:33:05
Nach oben


Antwort erstellen
13 Beiträge • Seite 1 von 1

Zurück zu Softwareentwicklung und -paketierung, Scripting

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste

Willkommen!
Startseite
Chat
Wiki/Tipps
Planet
Bildergalerie
NoPaste
Links
identi.ca-Gruppe
Twitter
dieses und jenes
Forum
Foren-FAQ
Registrieren
Anmelden
Suchen
Erweiterte Suche
unbeantw. Beiträge
aktive Themen



No ePatents Button
FSFE Supporter 2004 Button
top
Zum Seitenanfang
Diese Webseite ist keine offizielle Webseite des Debian Projekts.
Haftungsausschluss und Impressum – debianforum.de Verhaltensregeln

Powered by phpBB © 2000-2008 phpBB Group. Deutsche Übersetzung durch phpBB.de
Template entwickelt von Timo Salmen, basierend auf dem Debian Live Template, entwickelt von Christoph Haas.