grep-problem bzw hilfe benötigt für grep
Hallo Liste erst einmal etwas zur Erklärung, was ich mache, bzw machen möchte: von einer website hole ich mir bestimmte informationen (via script), diese werden in ein txt file gespeichert soweit klappt das ganze ganz gut - nur sind die informationen dann noch nicht sofort verwendbar, das das script den text pur speichert. (nicht beeinflussbar) die daten sollen dann zb. via gnumeric weiterverarbeitet werden - ohne erst 3 std das textfile von hand zu überarbeiten. grund : original-text (angepasst): Vorname person 1 voller name person 1 <leerzeile> restdaten der person 1 Vorname person 2 voller name person 2 <leerzeile> restdaten der person 2 [...] Vorname person 200 voller name person 200 leerzeile restdaten der person 200 nun bräuchte ich allerdings das ganze einzeillig pro person zum inport in die tabellenverwaltung also zb so: Vorname person 1|voller name person 1|restdaten der person 1 Vorname person 2|voller name person 2|restdaten der person 2 ..... Vorname person 200|voller name person 200|restdaten der person 200 weiß jemand, wie ich da die "unerwünschten" CRLF und die leerzeile via grep rausbekomme, ohne das das ganze komplett einzeillig wird ? leider hat mir google bzw die tutorials zu grp dabei nicht viel weitergeholfen. Mit freundlichem Gruß, M.Jäger -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi Marco! On Mi, 07 Sep 2011, Marco Jäger wrote:
von einer website hole ich mir bestimmte informationen (via script), diese werden in ein txt file gespeichert soweit klappt das ganze ganz gut - nur sind die informationen dann noch nicht sofort verwendbar, das das script den text pur speichert. (nicht beeinflussbar)
die daten sollen dann zb. via gnumeric weiterverarbeitet werden - ohne erst 3 std das textfile von hand zu überarbeiten. grund :
original-text (angepasst):
Vorname person 1 voller name person 1 <leerzeile> restdaten der person 1 Vorname person 2 voller name person 2 <leerzeile> restdaten der person 2 [...] Vorname person 200 voller name person 200 leerzeile restdaten der person 200
nun bräuchte ich allerdings das ganze einzeillig pro person zum inport in die tabellenverwaltung also zb so: Vorname person 1|voller name person 1|restdaten der person 1 Vorname person 2|voller name person 2|restdaten der person 2 ..... Vorname person 200|voller name person 200|restdaten der person 200
weiß jemand, wie ich da die "unerwünschten" CRLF und die leerzeile via grep rausbekomme, ohne das das ganze komplett einzeillig wird ?
Grep ist hier das falsche tool. Das geht mit ein paar Zeilen awk. Hier ist eine quick and dirty Lösung, das geht sicher eleganter, aber es fehlen doch ein paar Informationen (z.B. Wieviele Records pro Datensatz?): #v+ awk ' /./{ i=0; a[i++] = $0; while ((getline line) > 0 && line ~ /./) a[i++] = line for (j=0; j < i-2; j++){ printf "|" a[j] } if (getline foo > 0) { printf "\n" a[i-2] "|" a[i-1] "|" foo } else{ printf a[i-2] "|" a[i-1] "\n" } } ' < person.txt #v- Mit freundlichen Grüßen Christian -- Verliebt: Er spricht, sie lauscht. Verlobt : Sie spricht, er lauscht. Verheiratet: Beide sprechen, die Nachbarn lauschen. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Donnerstag 08 September 2011 11:39:57 schrieb Christian Brabandt:
Hi Marco!
On Mi, 07 Sep 2011, Marco Jäger wrote: [....]
Hallo Christian, naja - unter linux gibt es fast schon zu viele tools, um da die übersicht 100% zu behalten, und beim thema filterung + textfile fiel mir als erstes grep ein. Was die fehlenden Infos angeht (z.B. Wieviele Records pro Datensatz): Einträge pro Datenzeile > wichtig sind nur Voller name + restdaten = wären also in einer tabellenverwaltung 2 spalten, wobei bei den restdaten wie beim vollen namen auch leerzeichen enthalten sind, die erhalten werden müssen zur lesbarkeit. Anzahl der Zeilen pro Datenfile -> variabel, können mal 290 sein, mal 310. wobei zumindest aktuell die letzten 15-20 Zeilen nicht von Bedeutung sind (kann sich aber ändern) der vorname extra wäre nicht notwendig ( diese spalte würde ich dann nach dem import löschen ) und da das ja alles variable daten sind, wollte ich den aufwand "sparen" diese daten dann via script auch noch auszufiltern. (zeitaufwand diese spalte dann zu löschen ist minimal in meinen augen) wichtig wäre wie gesagt nur, das ich nicht mehr von Hand in der textdatei via kedit die überflüssigen CRLF + die leerzeilen editieren muss ( geht ja leider nicht mal via suchen+ ersetzen) - und bei der datenmenge ( ca 26 kb im rohen textfile) ist das doch extrem zeitraubend, zumal das direkte eintippen in gnumeric auch nicht schneller geht. nachtrag : Script ausprobiert, funktioniert 1A - muß nur noch eine leerzeile, die zu beginn entsteht, löschen (aber das ist eine arbeit von .... 2 sekunden ? ) ( jmarco@cpu1:~/Downloads/Daten> FV-Filter >> FV-Personen.txt ) auch wenn das vielleicht nicht das ideale script dafür ist, es erfüllt seinen sinn und zweck zu 100%. Danke !!!! Mit freundlichem Gruß, Marco -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi Marco! On Do, 08 Sep 2011, Marco Jäger wrote:
wichtig wäre wie gesagt nur, das ich nicht mehr von Hand in der textdatei via kedit die überflüssigen CRLF + die leerzeilen editieren muss ( geht ja leider nicht mal via suchen+ ersetzen)
Mit einem anständigen Editor hätte man auch was scripten können ;)
nachtrag : Script ausprobiert, funktioniert 1A - muß nur noch eine leerzeile, die zu beginn entsteht, löschen (aber das ist eine arbeit von .... 2 sekunden ? )
awk ' BEGIN {skip=1} /./{ i=0; a[i++] = $0; while ((getline line) > 0 && line ~ /./) a[i++] = line for (j=0; j < i-2; j++){ printf "|" a[j] } if (getline foo > 0) { printf (skip ? "" : "\n") a[i-2] "|" a[i-1] "|" foo } else{ printf a[i-2] "|" a[i-1] "\n" } skip=0 } ' < person.txt >out.txt Achso, wenn du die erste Spalte mit dem Vornamen eh nicht brauchst, dann lösch einfach den Teil mit a[i-2] "|"
sinn und zweck zu 100%. Danke !!!!
Gerne. War mal ganz nett, wieder mal awk auszuprobieren. Mit freundlichen Grüßen Christian -- Es ist manchmal unangenehm zu wissen was Morgen kommt, aber katastrophal, nicht zu wissen was gestern war. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (2)
-
Christian Brabandt
-
Marco Jäger