Tabellenumformung - mit awk lösbar?
Hallo zusammen, kann man mit awk folgendes lösen: Quelltabelle: Andre Porsche Audi BMW Tina Toyota Mazda Zieltabelle: Andre Porsche Andre Audi Andre BMW Tina Toyota Tina Mazda Es sollen also die Werte einiger Spalten in eine einzige überführt werden, dafür aber soll die zugehörige Zeile dupliziert werden. Es kann vorkommen, daß ein Datensatz nicht in allen Spalten Einträge hat (Tina fährt nur zwei Autos). Maximal gibt es aber drei Autos. Hoffe das war soweit verständlich beschrieben. Geht das mit awk? Wenn ja, würd ich mich über ein paar Anstöße freuen, wie ich das Problem angehen kann. Danke+Gruß! -- 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
Am Mittwoch, 11. August 2010, 14:07:03 schrieb Andre Tann:
Hallo zusammen,
kann man mit awk folgendes lösen:
Quelltabelle:
Andre Porsche Audi BMW Tina Toyota Mazda
Zieltabelle:
Andre Porsche Andre Audi Andre BMW Tina Toyota Tina Mazda
Es sollen also die Werte einiger Spalten in eine einzige überführt werden, dafür aber soll die zugehörige Zeile dupliziert werden. Es kann vorkommen, daß ein Datensatz nicht in allen Spalten Einträge hat (Tina fährt nur zwei Autos). Maximal gibt es aber drei Autos.
Hoffe das war soweit verständlich beschrieben. Geht das mit awk? Wenn ja, würd ich mich über ein paar Anstöße freuen, wie ich das Problem angehen kann.
Danke+Gruß!
Shell reicht doch:; #!/bin/sh while read line do set $line x=$1 shift while [ $# -gt 0 ] do echo $x $1 shift done done < $DATEI Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer ------------------------------------------------------------------------------- Diese EMail ist elektronisch mittels GPG / PGP signiert. Diese elektronische Unterschrift ist in einem EMail-Anhang enthalten. Leider kann die Signatur ohne die Installation entsprechender Programme weder geprueft noch angezeigt werden. Mehr dazu unter: http://www.gnupg.org oder auch http://www.pgpi.org -------------------------------------------------------------------------------
Servus Jürgen, Dr. Jürgen Vollmer, Mittwoch 11 August 2010:
#!/bin/sh
while read line do set $line x=$1 shift while [ $# -gt 0 ] do echo $x $1 shift done done < $DATEI
Bye Jürgen
Jetzt habe ich mich wenigstens mal mit set und shift auseinandergesetzt, und weiß jetzt sogar, was positional parameters sind (auch wenn ich nicht kapiere, warum die "positional" heißen). Die echte Aufgabenstellung war etwas komplizierter, sodaß ich es doch letztlich mit awk gelöst habe. Trotzdem hat Dein Beispiel einiges gebracht. Danke+Gruß! -- 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 Don, 12 Aug 2010, Andre Tann schrieb:
Dr. Jürgen Vollmer, Mittwoch 11 August 2010:
while read line do set $line
Hier sollte man übrigens set -- $line verwenden.
Jetzt habe ich mich wenigstens mal mit set und shift auseinandergesetzt, und weiß jetzt sogar, was positional parameters sind (auch wenn ich nicht kapiere, warum die "positional" heißen).
Weil man sie nur über ihre Position "ansprechen" kann, nicht über Namen. HTH, -dnh -- Vi ist für Leute, deren Hände für Emacs zu klein sind. -- Florian Diesch -- 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
On Wednesday, August 11, 2010 14:07:03 Andre Tann wrote:
kann man mit awk folgendes lösen:
Quelltabelle:
Andre Porsche Audi BMW Tina Toyota Mazda
Zieltabelle:
Andre Porsche Andre Audi Andre BMW Tina Toyota Tina Mazda
echo -e 'a 1 2 3\nb 4 5' | awk '{for(i=2;i<=NF;i++){print$1,$i}}' a 1 a 2 a 3 b 4 b 5 Torsten Förtsch -- Need professional modperl support? Hire me! (http://foertsch.name) Like fantasy? http://kabatinte.net -- 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
Servus Torsten und Jürgen, Torsten Förtsch, Mittwoch 11 August 2010:
echo -e 'a 1 2 3\nb 4 5' | awk '{for(i=2;i<=NF;i++){print$1,$i}}'
So einfach... Auch die Shell-Lösung. Hätt ich auch mal selber draufkommen können... Danke! -- 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
participants (4)
-
Andre Tann
-
David Haller
-
Dr. Jürgen Vollmer
-
Torsten Förtsch