Hallo MitLISTige,
Ich habe hier eine kleine Aufgabe geerbt...
Gegeben sind zwei (Text-)Dateien:
a) DB.txt: Eine CSV-Datei mit 15 Spalten/Trennzeichen ist ";" b) Vorlage.txt: Eine Textdatei, die "Spaltenbezeichner" enthält. (hier: [#01], [#02], ... [#15])
Aufgabe: Es soll eine Textdatei "Export.txt" erzeugt werden. Diese soll für jede Zeile aus DB.txt eine Kopie des Inhaltes von Vorlage.txt enthalten, bei der die Spaltenbezeichner durch die entsprechenden Inhalte von DB.txt ausgetauscht sind. Sozusagen ein Serienbriefdruck.
Beispiel:
DB.txt 1;2;3 4;5;9 2;7;9
Vorlage.txt
Die Summe von [#01] und [#02] ist [#03].
=> Export.txt
Die Summe von 1 und 2 ist 3. Die Summe von 4 und 5 ist 9. Die Summe von 2 und 7 ist 9.
Randbedingungen:
Die Spaltenbezeichner kommen alle genau ein Mal in Vorlage.txt vor (keine Spalte wird ausgelassen, Kein Bezeichner doppelt). Zudem kommen sie genau aufeinanderfolgend vor.
Später soll das Skript erweitert werden (mehrfaches Vorkommen der Bezeichner, nicht alle Spalten werden müssen vorkommen, die Reihenfolge soll beliebig sein.
Ich brauche nur ein paar Meinungen und Denkanstöße: Welche Befehle/Programme sind meine Freunde...
Gruß, Michael
Hallo,
Am Die, 29 Jan 2008, Michael Höhne schrieb: [..]
Beispiel:
DB.txt 1;2;3 4;5;9 2;7;9
Vorlage.txt
Die Summe von [#01] und [#02] ist [#03].
=> Export.txt
Die Summe von 1 und 2 ist 3. Die Summe von 4 und 5 ist 9. Die Summe von 2 und 7 ist 9.
[..]
Ich brauche nur ein paar Meinungen und Denkanstöße: Welche Befehle/Programme sind meine Freunde...
Perl + LaTeX :P
Für obigen einfachen Fall tut's auch awk.
==== foo.awk ==== #!/usr/bin/gawk -f BEGIN { FS=";"; while ( getline l < "Vorlage.txt" ) { V=V l; } close("Vorlage.txt"); }
{ l = V; gsub(/[#01]/, $1, l); gsub(/[#02]/, $2, l); gsub(/[#03]/, $3, l); print l; } ====
$ gawk -f foo.awk DB.txt Die Summe von 1 und 2 ist 3. Die Summe von 4 und 5 ist 9. Die Summe von 2 und 7 ist 9. $
HTH, -dnh
Hallo David,
[...]
Ich brauche nur ein paar Meinungen und Denkanstöße: Welche Befehle/Programme sind meine Freunde...
Perl + LaTeX :P
O.K. das kommt mir entgegen... Dann kann ich in der Firma mit den Lobreden auf LaTeX fortfahren.
Für obigen einfachen Fall tut's auch awk.
So was in der Art hatte ich vermutet
[Skript]
Super! Ich muss mir endlich mal wieder Zeit nehmen und meine rudimentären Kommandozeilen-Kenntnisse aufpolieren.
Mit bestem Dank, Michael
Hallo,
Am Die, 29 Jan 2008, David Haller schrieb: [..]
==== foo.awk ==== #!/usr/bin/gawk -f BEGIN { FS=";"; while ( getline l < "Vorlage.txt" ) { V=V l; } close("Vorlage.txt"); }
{ l = V; gsub(/[#01]/, $1, l); gsub(/[#02]/, $2, l); gsub(/[#03]/, $3, l); print l; } ====
Nachtrag: hier kann man natürlich noch Checks einbauen, z.B. sowas:
==== # ... { if( $1 + $2 != $3 ) { print "Fehler: "FILENAME "[" FNR "]: Summe stimmt nicht." > "/dev/stderr"; exit 1; } l = V; gsub(/[#01]/, $1, l); gsub(/[#02]/, $2, l); gsub(/[#03]/, $3, l); print l; } ====
-dnh
Hallo David,
Nachtrag: hier kann man natürlich noch Checks einbauen, z.B. sowas:
if( $1 + $2 != $3 ) { print "Fehler: "FILENAME "[" FNR "]: Summe stimmt nicht." > "/dev/stderr"; exit 1;
Die "Additionen" waren nur das erstbeste Beispiel das mir eingefallen ist :-)
Aber trotzdem Dank für den Hinweis, denn es gibt tatsächlich einen Sonderfall, den ich berücksichtigen muss...
Gruß, Michael
Hallo David,
nur fürs Archiv:
Ich hatte nun eine mehrzeilige Vorlage bekommen. Durch das Zusammensetzen der Vorlage in AWK (V=V l;) gingen die Zeilenumbrüche verloren.
Ich habe mir wie folgt beholfen:
Der Klammeraffe taucht als Zeichen niemals auf, also habe ich
V=V l;
in
V=V l "@";
geändert. Die @ zeigen an, wo wieder ein Zeilenvorschub rein muss.
Im unteren Bereich ist dann ein
gsub(/@/, "\n", l);
dazugekommen, der das erledigt.
Gruß, Michael
Hallo,
Am Die, 19 Feb 2008, Michael Höhne schrieb:
Ich hatte nun eine mehrzeilige Vorlage bekommen. Durch das Zusammensetzen der Vorlage in AWK (V=V l;) gingen die Zeilenumbrüche verloren.
Ich habe mir wie folgt beholfen: Der Klammeraffe taucht als Zeichen niemals auf, also habe ich V=V l; in V=V l "@"; geändert. Die @ zeigen an, wo wieder ein Zeilenvorschub rein muss.
Versuch's mit:
V=V l"\n";
;)
-dnh
Hallo David,
Ich habe mir wie folgt beholfen: Der Klammeraffe taucht als Zeichen niemals auf, also habe ich V=V l; in V=V l "@"; geändert. Die @ zeigen an, wo wieder ein Zeilenvorschub rein muss.
Versuch's mit:
V=V l"\n";
;)
Logo!.... <Brett vorm Kopf wegnehm> ;-)))
Gruß, Michael
Hallo Michael,
On Tuesday 29 January 2008 23:10:51 Michael Höhne wrote:
Ich habe hier eine kleine Aufgabe geerbt...
Habe einen kleinen Ansatz fuer dich:
#!/bin/bash declare -a c tr ';' ' ' <DB.txt | \ while read line do c=(0 $line) eval echo "$(cat Vorlage.txt | sed 's/[#0*([0-9]*)]/${c[\1]}/g')" done
Ergibt bei mir:
Die Summe von 1 und 2 ist 3. Die Summe von 4 und 5 ist 9. Die Summe von 2 und 7 ist 9.
Roman
Hallo Roman,
Habe einen kleinen Ansatz fuer dich:
[batch]
Auch dir vielen Dank für die Hilfe. Ich werde am Wochenende mal eine Bastelrunde einlegen...
Gruß, Michael