Hallo Liste, mir liegt eine Texttabelle vor mit mehreren Spalten, getrennt mit Tab. Den Wert der dritten Spalte möchte ich gerne mit " umschließen. Die Spalten davor und danach sollen bleiben wie sie sind. Aus Spalte1 Spalte2 Spalte3 Spalte4 soll also werden Spalte1 Spalte2 "Spalte3" Spalte4 Wie kann ich das anstellen? -- Andre Tann -- 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 Die, 16 Jan 2007, Andre Tann schrieb:
mir liegt eine Texttabelle vor mit mehreren Spalten, getrennt mit Tab. Den Wert der dritten Spalte möchte ich gerne mit " umschließen. Die Spalten davor und danach sollen bleiben wie sie sind.
Aus
Spalte1 Spalte2 Spalte3 Spalte4
soll also werden
Spalte1 Spalte2 "Spalte3" Spalte4
Wie kann ich das anstellen?
Mit evtl. Verdopplung der '"': awk -F'\t' 'BEGIN { OFS="\t"; } { $3="\"" $3 "\""; print; }' oder awk -F'\t' 'BEGIN { OFS="\t"; } { sub(/.*/, "\"\&\"", $3); print; }' ohne: awk -F'\t' 'BEGIN { OFS="\t"; } { sub(/^\"?/, "\"", $3); sub(/\"?$/, "\"", $3); print; }' Mit sed geht's natürlich auch, aber umständlich, weil man die Felder (wie in Andreas' perl-Vorschlag) selber trennen muß. Mit perl (ohne evtl. '"'-Verdopplung): perl -an -F'\t' -e ' $F[2] =~ s/^"?/"/; $F[2] =~ s/"?$/"/; print join("\t", @F);' oder perl -an -F'\t' -e ' $F[2] =~ s/^"?(.*?)"?$/"$1"/; print join("\t", @F);' Zu -a und -F -> man perlrun, da ist auch ein Beispiel und wie man's per Hand macht[1]. Viel Spass ;) -dnh [1] Tip: perl -MO=Deparse -an -F'\t' -e '...' -- 99: EDV Experimentelle Daten Verarbeitung (Andreas Frackowiak) -- 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 Dienstag, 16. Januar 2007 13:31 schrieb Andre Tann:
Hallo Liste,
mir liegt eine Texttabelle vor mit mehreren Spalten, getrennt mit Tab. Den Wert der dritten Spalte möchte ich gerne mit " umschließen. Die Spalten davor und danach sollen bleiben wie sie sind.
Aus
Spalte1 Spalte2 Spalte3 Spalte4
soll also werden
Spalte1 Spalte2 "Spalte3" Spalte4
Wie kann ich das anstellen? Warum muss es immer gleich awk und sed sein? bash tut's auch (wird oft unterschätzt siehe: c't 2/2007 ab Seite 178) zB so:
#!/bin/bash eingabe=${1} exec 4< ${eingabe} while read -u4 -a zeile do zeile[2]="\"${zeile[2]}\"" echo ${zeile[@]} done exec 4<&- In erster Näherung! Da ist mit Sicherheit noch Potential drin, bin aber zu faul das auszuloten. Zum Beispiel werden aus den Tabs bei der Ausgabe Leerzeichen. Könnte man auch über eine for-Schleife regeln (oder sed ;-) ). -- Mit freundlichen Grüßen Matthias Müller (Benutzer #439779 im Linux-Counter http://counter.li.org) PS: Bitte senden Sie als Antwort auf meine E-Mails reine Text-Nachrichten! Siehe auch: http://www.gnu.org/philosophy/no-word-attachments.de.html
Matthias Müller wrote:
[...] Warum muss es immer gleich awk und sed sein?
Weil sich das Problem mit awk als Einzeiler loesen laesst, waehrend Deine bash-Loesung...
bash tut's auch (wird oft unterschätzt siehe: c't 2/2007 ab Seite 178) zB so:
#!/bin/bash eingabe=${1} exec 4< ${eingabe} while read -u4 -a zeile do zeile[2]="\"${zeile[2]}\"" echo ${zeile[@]} done exec 4<&-
...da doch deutlich komplizierter aussieht. Man sollte immer das Tool verwenden, das fuer eine Aufgabe am Besten geeignet ist. Wenn es darum geht, mit ASCII Daten im Spaltenformat zu arbeiten, zaehlt bash da in den meisten Faellen eben nicht dazu. Cheers, Th. -- 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 Thomas, Am Samstag, 20. Januar 2007 15:53 schrieb Thomas Hertweck: snip
Weil sich das Problem mit awk als Einzeiler loesen laesst, waehrend Deine bash-Loesung... Das ist richtig.
snip
...da doch deutlich komplizierter aussieht. Auch das stimmt.
Man sollte immer das Tool verwenden, das fuer eine Aufgabe am Besten geeignet ist. Nochmal ack
Wenn es darum geht, mit ASCII Daten im Spaltenformat zu arbeiten, zaehlt bash da in den meisten Faellen eben nicht dazu. und wieder ack.
Aber... Wenn ich mit dem am besten geeigneten Werkzeug nicht umgehen kann, nehme ich eben das zweitbeste. Vor allem dann, wenn solche Aufgaben wie die angesprochene, nicht zu den Standardaufgaben gehören. Aber wie gesagt, prinzipiell hast Du recht und üblicherweise würde ich bei sowas wie der angesprochenen Aufgabe, auch awk wählen. Ich wollte nur darauf hinweisen, dass es mit bash eben auch und zwar relativ einfach machbar ist. -- Mit freundlichen Grüßen Matthias Müller (Benutzer #439779 im Linux-Counter http://counter.li.org) PS: Bitte senden Sie als Antwort auf meine E-Mails reine Text-Nachrichten! Siehe auch: http://www.gnu.org/philosophy/no-word-attachments.de.html
participants (4)
-
Andre Tann
-
David Haller
-
Matthias Müller
-
Thomas Hertweck