Hallo Liste! Ich habe eine Textdatei, die ich mit sed in folgende Struktur (CSV) gebracht habe: " ";"text";"text" " ";"text";"text" Mir fehlt noch eine Lösung für folgende Aufgabenstellung: Ersetze die Leerzeichen in der 1. Spalte durch eine Zahl, die die Anzahl der Leerzeichen wiedergibt. Das obige Beispiel würde nach der Transformation so aussehen: "2";"text";"text" "4";"text";"text" Kann ich das mit sed machen? (Also mit sed die Leerzeichen zählen lassen?) Hat jemand eine andere Idee? Joachim -- 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
Hallo! Am 31.05.2007 um 17:38 schrieb Joachim Marx:
Mir fehlt noch eine Lösung für folgende Aufgabenstellung: Ersetze die Leerzeichen in der 1. Spalte durch eine Zahl, die die Anzahl der Leerzeichen wiedergibt. [...] Kann ich das mit sed machen? (Also mit sed die Leerzeichen zählen lassen?)
Ich denke nicht, zumindest nicht generell. Sed arbeitet im wesentlichen mit regulären Ausdrücken, und bei denen gibt es generell Schwierigkeiten mit dem Zählen. Einzig der Sonderfall, dass nur eine begrenzte Menge an unterschiedlichen Leerzeichen-Anzahlen vorkommt, könnte behandelt werden, indem man für jede Anzahl von Leerzeichen einen eigenen Ausdruck angibt (beispielsweise: s/ /1/, s/ /2/, s/ /3/ usw.)
Hat jemand eine andere Idee?
Ich würde eine etwas vollständigere Programmiersprache (Python oder sowas in der Richtung) benutzen. Viele Grüße Ralf-- 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 Ralf, hi Joachim Am Do 31. Mai 2007 18:28 schrieb Ralf Schuchardt:
Einzig der Sonderfall, dass nur eine begrenzte Menge an unterschiedlichen Leerzeichen-Anzahlen vorkommt, könnte behandelt werden, indem man für jede Anzahl von Leerzeichen einen eigenen Ausdruck angibt (beispielsweise: s/ /1/, s/ /2/, s/ /3/ usw.)
ABER: in umgekehrter reihenfolge ;) sonst ist für das zweite sed nirgends mehr ein " " vorhanden, sondern nur noch ein "11" ;) Also mit den meisten Leerzeichen anfangen, und einem Leerzeichen aufhören :) Gruss Beni -- Benjamin Neff info@benjaminneff.ch http://www.benjaminneff.ch
Hallo! Ralf Schuchardt wrote:
Ich denke nicht, zumindest nicht generell. Sed arbeitet im wesentlichen mit regulären Ausdrücken, und bei denen gibt es generell Schwierigkeiten mit dem Zählen.
sed kann aber schon ein bisschen mehr als einfach nur regexp ... Ich habe folgendes gefunden zum Thema "Zeichen mit sed zählen" (vielleicht interessiert es jemanden). Das Script zählt zwar alle Zeichen im gesamten Input, aber als Ansatz für mein Problem hilft mir das vielleicht weiter. # -------------------------------------------------------------------- # count all chars of input, kind of `wc -c' # the buffer hold the count x 1{ s/^/0/ } # we have a line, so at least there is one char: the `\n' tx :x s/9\(_*\)$/_\1/ tx s/^\(_*\)$/0\1/ s/ \(_*\)$/0\1/ s/8\(_*\)$/9\1/ s/7\(_*\)$/8\1/ s/6\(_*\)$/7\1/ s/5\(_*\)$/6\1/ s/4\(_*\)$/5\1/ s/3\(_*\)$/4\1/ s/2\(_*\)$/3\1/ s/1\(_*\)$/2\1/ s/0\(_*\)$/1\1/ s/_/0/g # get back to the line x # for each char in the line, increment the count tc :c s/.// x tx # on last line, all is done, so print the count, and quit ${p;q;} # put current line (which has been swapped with the count) to the buffer h # -------------------------------------------------------------------- -- 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 Joachim! On Thu, 31 May 2007, Joachim Marx wrote:
" ";"text";"text" " ";"text";"text"
Mir fehlt noch eine Lösung für folgende Aufgabenstellung: Ersetze die Leerzeichen in der 1. Spalte durch eine Zahl, die die Anzahl der Leerzeichen wiedergibt.
Das obige Beispiel würde nach der Transformation so aussehen:
"2";"text";"text" "4";"text";"text"
Kann ich das mit sed machen? (Also mit sed die Leerzeichen zählen lassen?) Hat jemand eine andere Idee?
Ich glaube nicht, dass sed das kann. Aber mit ein bißchen vim vodoo geht folgendes: :%s/^"\zs *\ze";.*$/\=strlen(submatch(0)) Das ersetzt in einer Datei alle Leerzeichen durch ihre Anzahl, wenn die Leerzeichen am Anfang einer Zeile nach einem '"' stehen. Man könnte das jetzt noch scripten, durch einen simplen Aufruf: vim -c ':%s/^"\zs *\ze";.*$/\=strlen(submatch(0))' -c ':wq' <dateiname> (in einer Zeile) Mit perl oder awk geht das bestimmt auch, da fällt mir aber auf die Schnelle keine Lösung ein. Mit freundlichen Grüßen Christian -- hundred-and-one symptoms of being an internet addict: 125. You begin to wonder how often it REALLY is necessary to get up and shower or bathe. -- 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
Joachim Marx schrieb:
Hallo Liste!
Ich habe eine Textdatei, die ich mit sed in folgende Struktur (CSV) gebracht habe:
" ";"text";"text" " ";"text";"text"
Mir fehlt noch eine Lösung für folgende Aufgabenstellung: Ersetze die Leerzeichen in der 1. Spalte durch eine Zahl, die die Anzahl der Leerzeichen wiedergibt.
Das obige Beispiel würde nach der Transformation so aussehen:
"2";"text";"text" "4";"text";"text"
Kann ich das mit sed machen? (Also mit sed die Leerzeichen zählen lassen?) Hat jemand eine andere Idee?
Nimm awk: Ohne die " gehts so: echo " ;text;text" | awk -F";" '{print length($1) ";" $2 ";" $3 }' mit, so oder so ähnlich ;) echo '" ";"text";"text"' \ | awk -F";" '{print "\""length($1) "\";" $2 ";" $3 ""}' Gruss Bernd -- 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
Hallo, Am Don, 31 Mai 2007, Joachim Marx schrieb:
Hallo Liste!
Ich habe eine Textdatei, die ich mit sed in folgende Struktur (CSV) gebracht habe:
" ";"text";"text" " ";"text";"text"
Mir fehlt noch eine Lösung für folgende Aufgabenstellung: Ersetze die Leerzeichen in der 1. Spalte durch eine Zahl, die die Anzahl der Leerzeichen wiedergibt.
Das obige Beispiel würde nach der Transformation so aussehen:
"2";"text";"text" "4";"text";"text"
Kann ich das mit sed machen?
Nur umständlich. Mit awk ist das einfach: awk -F';' '{ match($1, " +"); printf "\"%i\";%s;%s\n", RLENGTH, $2, $3; }' HTH, -dnh -- Chemie ist auch bloß spezialisierte Physik. -- Jens Dittmar in drsst -- 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
Hallo! David Haller wrote:
Am Don, 31 Mai 2007, Joachim Marx schrieb:
Kann ich das mit sed machen?
Nur umständlich. Mit awk ist das einfach:
awk -F';' '{ match($1, " +"); printf "\"%i\";%s;%s\n", RLENGTH, $2, $3; }'
Auf einen Vorschlag von David hatte ich auch noch gewartet :-) Mit sed ist es, obwohl im Prinzip möglich, wirklich zu umständlich - die awk und perl Einzeiler sind da viel eleganter. Trotzdem habe ich mich am Ende für das pragmatische sed-Workaround entschieden, wie es Ralf Schuchardt vorgeschlagen hatte. (Weil ich aus bestimmten Gründen lieber den ganzen Daten-Transformationsprozess in ein einziges sed-Script packen will.) Danke allen, für die vorgeschlagenen Lösungen (sed, perl, awk)! Joachim -- 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 (7)
-
Benjamin Neff
-
Bernd Obermayr
-
Christian Brabandt
-
David Haller
-
Joachim Marx
-
Ralf Schuchardt
-
Torsten Foertsch