ubuntuusers.de

Sed Skript Tut nicht was es soll ?

Status: Ungelöst | Ubuntu-Version: Kubuntu 9.10 (Karmic Koala)
Antworten |

Webbi

Anmeldungsdatum:
7. Januar 2007

Beiträge: 21

Wohnort: Ulm/Donau, Germany

Hallo Zusammen,

ich will mit Sed mir eine so genannte DSV (Deutscher Schwimmverband) Datei "zerstückeln" um die in eine private Datenbank einlesen zu können. Nach Wettkämpfen ist das immer so ein gefrickel gewesen das aus irgendwelchen PDF Files rauszulesen und dann von Hand irgendwo einzutragen, so dass ich mir überlegt hatte das einfacher zu gestalten:

Naja das File sieht nach einem Aufruf von egrep "Vereinsname|WK" file >> file2 so aus:

(* WK-Pro 2.36, xxx, Braunschweig, <http://www.wk-pro.de> *)
VEREIN:xxxx; VNKENNZAHL: 0000; LSV:18; NATION:GER;
WK: 1;E; (* 100 m Lagen weiblich [Jahrgang 2001] *)
WK: 1;E; (* 100 m Lagen weiblich [Jahrgang 2000] *)
WK: 1;E; (* 100 m Lagen weiblich [Jahrgang 1999] *)
WK: 1;E; (* 100 m Lagen weiblich [Jahrgang 1998] *)
10;Vorname, Name ;000000;W;1998; ;Vereinsname ;2480;0:00,00;1:51,53;
WK: 1;E; (* 100 m Lagen weiblich [Jahrgang 1997] *)
WK: 1;E; (* 100 m Lagen weiblich [Jahrgang 1996] *)
5;Vorname, Name ;227041;W;1996; ;Vereinsname;2480;0:00,00;1:36,74;
WK: 1;E; (* 100 m Lagen weiblich [Jahrgang 1995] *)
2;Vorname, Name ;227044;W;1995; ;Vereinsname ;2480;0:00,00;1:34,76;
.... (to be continued)

Das Problem ist: Ich muss die jeweils letzte Zeile vor einem Personeneintrag also zb die Zeile vor 10 Erhalten um die Daten herausziehen zu können (was wurde geschwommen insbesondere - die "WK-Zeilen" ohne nachfolgende Personenanzeige sollen verschwinden - die werden nicht benötigt. Hab jetzt mit SED über ne Stunde rumgespielt (gut ich hatte keine Erfahrung mit Regexp's usw) aber trotzdem nichts vernünftiges rausbekommen. Weiß da jemand Rat? Dankeschön ☺

Also Ergebniss soll so ausschauen:

(* WK-Pro 2.36, xxx, Braunschweig, <http://www.wk-pro.de> *)
VEREIN:xxxx; VNKENNZAHL: 0000; LSV:18; NATION:GER;
WK: 1;E; (* 100 m Lagen weiblich [Jahrgang 1998] *)
10;Vorname, Name ;000000;W;1998; ;Vereinsname ;2480;0:00,00;1:51,53;
WK: 1;E; (* 100 m Lagen weiblich [Jahrgang 1996] *)
5;Vorname, Name ;227041;W;1996; ;Vereinsname ;2480;0:00,00;1:36,74;
WK: 1;E; (* 100 m Lagen weiblich [Jahrgang 1995] *)
2;Vorname, Name ;227044;W;1995; ;Vereinsname ;2480;0:00,00;1:34,76;
.... (to be continued)

felixr

Avatar von felixr

Anmeldungsdatum:
5. Dezember 2009

Beiträge: 6

Hallo, eins vorweg: ich bin kein Programmierprofi. Der Link bringt Dich auf eine Seite mit vielen sed-Beispielen.

Ich habe mir vor langer Zeit http://sed.sourceforge.net/sed1line_de.html gebookmarkt. Da steht etwa auf der Mitte :

# Ausgabe der Zeile direkt unterhalb des Regex, jedoch nicht die Zeile # die den Regex erfüllt. sed -n '/regexp/{n;p;}'

Das würde heißen Du kannst mit sed die WK zeile vor der Zeile mit den Namen finden, welche Du haben willst, anschließend fügst Du die WK Zeile z.B. mit grep oder wieder mit sed ein.

Am Besten Du postest mal Dein Script.

Webbi

(Themenstarter)

Anmeldungsdatum:
7. Januar 2007

Beiträge: 21

Wohnort: Ulm/Donau, Germany

Mhm dann hätte ich aber immer noch das Problem, dass unter Umständen mehrere Namen auftauchen unter einer WK Zeile. Das würde ich damit ja nicht erwischen oder ?

felixr

Avatar von felixr

Anmeldungsdatum:
5. Dezember 2009

Beiträge: 6

In Deinem oberen Codeblock ist immer unter einer Namenszeile die dazu gehörende(?) WK Zeile. Der sed Befehl sucht nach allen Namenszeilen und gibt sie (eine WK Zeile danach) aus. Ein paar Beispiele vorher steht der vergleichbare "grep-Befehl". Soll heißen mit dem einen Befehl die Namenszeile extrahieren und dann (sed oder grep) die dazu gehörende WK Zeile. Das ganze in eine Schleife packen und durchlaufen lassen bis die Datei zu Ende ist.

10;Vorname, Name ;000000;W;1998; ;Vereinsname ;2480;0:00,00;1:51,53;
WK: 1;E; (* 100 m Lagen weiblich [Jahrgang 1997] *)
WK: 1;E; (* 100 m Lagen weiblich [Jahrgang 1996] *)
5;Vorname, Name ;227041;W;1996; ;Vereinsname;2480;0:00,00;1:36,74;
WK: 1;E; (* 100 m Lagen weiblich [Jahrgang 1995] *)
2;Vorname, Name ;227044;W;1995; ;Vereinsname ;2480;0:00,00;1:34,76;
.... (to be continued)

Webbi

(Themenstarter)

Anmeldungsdatum:
7. Januar 2007

Beiträge: 21

Wohnort: Ulm/Donau, Germany

felixr schrieb:

In Deinem oberen Codeblock ist immer unter einer Namenszeile die dazu gehörende(?) WK Zeile. Der sed Befehl sucht nach allen Namenszeilen und gibt sie (eine WK Zeile danach) aus. Ein paar Beispiele vorher steht der vergleichbare "grep-Befehl". Soll heißen mit dem einen Befehl die Namenszeile extrahieren und dann (sed oder grep) die dazu gehörende WK Zeile. Das ganze in eine Schleife packen und durchlaufen lassen bis die Datei zu Ende ist.

10;Vorname, Name ;000000;W;1998; ;Vereinsname ;2480;0:00,00;1:51,53;
WK: 1;E; (* 100 m Lagen weiblich [Jahrgang 1997] *)
WK: 1;E; (* 100 m Lagen weiblich [Jahrgang 1996] *)
5;Vorname, Name ;227041;W;1996; ;Vereinsname;2480;0:00,00;1:36,74;
WK: 1;E; (* 100 m Lagen weiblich [Jahrgang 1995] *)
2;Vorname, Name ;227044;W;1995; ;Vereinsname ;2480;0:00,00;1:34,76;
.... (to be continued)

Aah, nein leider nicht ganz so. Also zur entsprechenden Namenszeile gehört eben die darüberliegende WK Zeile. Wenn ich jetzt 3-4 Namen zb untereinander habe gehört die WK Zeile über der Ersten Namenszeile zu allen darunterliegenden Namenszeilen dazu.... Aber du hast mir schonmal ne Idee geliefert wie ich das machen könnte - ich versuchs nochmal und schreib dann hier rein was ich genau gemacht hab wenns klappt bzw eben auch wenns nicht hinhaut 😉 Danke!

Antworten |