Carwyn Geschrieben 15. August 2012 Geschrieben 15. August 2012 Hallo, keine Ahnung, ob ich hier richtig bin, oder das eher irgendwo in die Algorithmik gehört, aber ein Mod kann's ja ggf. verschieben. Vorweg, ich habe mich bis gestern mit sed nie beschäftigt, also verzeiht wenn ich als Anfängerin da Dinge übersehe. Ich habe mir eine Datei aus einer Datenbank heraus erstellen lassen, die in etwa folgendermaßen aussieht: SQL> SQL> SELECT MITARBEITER, VORNAME, NAME FROM Tabelle; ^LMITARBEITER;VORNAME ;NAME <ID>;<Vorname> ;<Name> <ID>;<Vorname> ;<Name> <ID>;<Vorname> ;<Name> [Noch gaaaaanz viele Datensätze] SQL> SQL> SPOOL OFF Daraus soll mal, wenn sie groß ist, eine simple csv-Datei werden mit ausschliesslich nur noch: <ID>;<Vorname>;<Name> <ID>;<Vorname>;<Name> <ID>;<Vorname>;<Name> <ID>;<Vorname>;<Name> [Wieder irre viele Datensätze] Jetzt habe ich bereits herausgefunden, wie ich mit sed die ersten und letzten Zeilen + Tabellenkopf entferne, so dass ich nur noch die Datensätze sehe und wie ich die ersten Leerzeichen trimme, so dass die ID direkt am Zeilenanfang steht. Nun stehe ich aber vor dem Problem, dass ich die weiteren Bereiche der Zeilen noch trimmen will. Das Beispiel oben ist nur mit drei Spalten. Das können natürlich unterschiedlich viele sein. Ich brauche also eine Idee, wie ich sed sagen kann: Gehe zum ersten SemikolonGehe dann zurück zum Wortende des letzten Wortes (Kann ja auch sein, das der Name oder ein anderer Datensatz aus mehr Worten besteht und Leerzeichen enthält)Lösche alle in diesem Zwischenraum liegenden LeerzeichenWiederhole diese Schritte bei allen weiteren Semikolons (-kolen?), bis Du am Zeilenende angekommen bist Bisher habe ich nur Beispiele gefunden, wie ich Leerzeichen am Anfang einer Zeile lösche und am Ende. Aber nicht mitten drin. Was ich rausfand war, dass es ein positive lookbehind gibt, d.h. dass ich mit (?<=\ eigentlich sagen können müsste "Gehe zurück zum letzten Wortende". Nur wie sag ich ihm von wo und - vor allen Dingen - wie sage ich ihm quasi als Schleife (while Zeilenende = false...do), dass er das beständig bis zum Zeilenende wiederholen soll? Hat einer eine Idee? Eigentlich klingt das nach ner super Übungsaufgabe für sed, aber bisher habe ich wie gesagt nur gefunden, dass ich mit sed -e 's/^[ \t]*//' die Anfangszeilen trimmen kann und mit sed 's/^[ \t]*//;s/[ \t]*$//' das am Anfang wie auch am Ende machen kann. Dazwischen ist mir aber weit wichtiger. *g* Vielen Dank schonmal im Voraus. Zitieren
carstenj Geschrieben 15. August 2012 Geschrieben 15. August 2012 Hi, verstehe ich das jetzt richtig, dass du ALLE Leerzeichen rausfiltern möchtest? Zitieren
Carwyn Geschrieben 15. August 2012 Autor Geschrieben 15. August 2012 Nur die Leerzeichen zwischen Datensatz und Semikolon ("<Datensatz><ganz viel whitespace>;<Datensatz><ganz viel whitespace>;" soll zu "<Datensatz>;<Datensatz>;" werden). Eben genau nicht die Leerzeichen in den Datensätzen selber. Zitieren
carstenj Geschrieben 15. August 2012 Geschrieben 15. August 2012 Hi, wenn das Oracle ist, kannst du die ganzen Header im Vorfeld abstellen: sql - How do I spool to a CSV formatted file using SQLPLUS? - Stack Overflow Zitieren
Dragon8 Geschrieben 15. August 2012 Geschrieben 15. August 2012 Ich kenn mich jetzt nicht mit sed aus, aber wenn es nicht sed sein muss, sondern auch perl geht, würde folgendes deine Leerzeichen entfernen: perl -e 'while(<STDIN>) { [B]s/(?<=\s+(?=([^;]+))//g[/B]; print; }'[/CODE] Wobei die Daten über die Standardeingabe übergeben werden, zum Beispiel folgendermaßen: [CODE]cat <DATEI> | <Perlaufruf> Andererseits kannst du vll auch den RegExp (fett makiert) für sed benutzen. Zitieren
Carwyn Geschrieben 15. August 2012 Autor Geschrieben 15. August 2012 @Carsten Der Link sieht super aus. Das probiere ich heute Nachmittag mal aus. Danke! Zitieren
bummel Geschrieben 16. August 2012 Geschrieben 16. August 2012 (bearbeitet) cat [DATEI1] | sed 's/> *;/>;/g' | sed 's/^ *</</' > [DATEI2] So könnte man das mit sed machen. Bearbeitet 16. August 2012 von bummel Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.