PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeilenende per awk oder sed löschen



AndreasMurr
02-05-2003, 08:45
Erstmal hallo, ich bin hier neu ;)

Mein Problem ist, daß ich eine Textdatei habe, die Zeilenweise Adress-Infos hat. Diese sollen aber nun hintereinander in einer Zeile stehen, wobei die eben blockweise zusammengefaßt werden müssen.

Beispiel:

Ausgangsdatei:

Name: Meier
Vorname: Horst
Adresse: Teststraße 1
Ort: München
Name: Müller
Vorname: Gerhard
Adresse: Hauptstr. 3
Ort: Hannover

Enddatei:
Meier;Horst;Teststraße1;München
Müller;Gerhard;Hauptstr. 3;Hannover

Es kann auch sein, daß mal die Zeile "Vorname" fehlt....
also wäre es wichtig, daß ich ein Ersetzen von "Zeilenende mit Beschreibung der nächsten Zeile" schaffe, da nicht immer 4 Zeilen pro Datenblock da sind, sondern vielleicht auch mal nur 3.

Unter sed würde ich sagen: sed '/$Vorname: //g' was aber nicht funktionieren kann, denn er erkennt ja "$" als Ende der Zeile und vermutet das "Vorname: " dahinter, nicht in der nächsten Zeile.

Das Problem ist einfach, daß sed das Zeilenende nicht als solches interpretieren und löschen kann.

Ich habe das Ganze schonmal in einem Skript mit AWK gesehen, finde dies aber absolut nicht mehr.. :(

Wäre nett, wenn Ihr mir helfen könnt....

Danke

fork
02-05-2003, 12:45
#!/usr/bin/perl -w

open(EIN, "<eingabedatei");
open(AUS, ">ausgabedatei");

foreach(<EIN>) {
chomp();
s/Name: (.*)$/$1\;/;
s/Vorname: (.*)$/$1\;/;
s/Adresse: (.*)$/$1\;/;
s/Ort: (.*)$/$1\n/;
print AUS "$_";
}

close(EIN);
close(AUS);

Das ist die Lösung in Perl, da Du das wahrscheinlich nicht kennst eine kurze Beschreibung:
- Ein- + Ausgabedateien werden geöffnet.
- Jede Zeile wird in einer Schleife verarbeitet:

Das Newline am Ende wird entfernt
Die Zeile "Name: Meier" wird durch "Meier;" ersetzt. Dasselbe für Vorname, Adresse
Die Zeile "Ort: Muenchen" wird durch "Muenchen\n" ersetzt(Es wird natürlich immer nur einer der vier Ersetzungsvorgänge durchgeführt, weil ja in einer Zeile immer nur ein Datum steht.)
Die Zeile wird geschrieben
- Die Dateien werden geschlossen

Gruß
Tobias

AndreasMurr
02-05-2003, 17:29
Danke für Deine Antwort...

ich hab nur schon ne konkrete Idee mit Shell-Skript im Kopf, da die Datei erst bearbeitet werden muß, um das o.g. Zwischenergebnis zu bekommen, und wird danach noch weiterverarbeitet.

Es wäre toll, wenn es eine Lösung für Shell gibt, vielleicht auch, wie man nen Zeilenumbruch EINFÜGEN kann ;)

AndreasMurr
02-05-2003, 18:41
Aaaalso,

es geht z.B. über

a=`cat Beispiel.txt`
echo $a

Dann wird die Variable a ohne alle Zeilenumbrüche dargestellt, und dann kann ich ja mit sed Trenner einfügen, z.B. sed 's/Vorname: /;/g'

und einen Umbruch fügt man mit
awk 'gsub("Name: ",\n)'

ein....

Viola

Ist zwar nicht so, wie ich es in Erinnerung habe, aber es funktioniert. Und das ist die Hauptsache. Wenn einem noch ne elegantere Lösung einfällt, bitte immer her damit ;)