Hallo zusammen, eine Frage zu awk: Es seien zwei Tabellen gegeben, deren Spaltenköpfe so aussehen: feld1 feld2 feld3 ID feld4 feld5 und ID In der zweiten Tabelle befindet sich in der einzigen Spalte ID eine Liste von IDs. Nun möchte ich aus der ersten Tabelle alle diejenigen Zeilen herausfiltern, deren ID in der zweiten Tabelle aufgeführt ist. Wie kann man 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
Am Dienstag 10 November 2009 09:47:16 schrieb Andre Tann:
Hallo zusammen,
eine Frage zu awk: Es seien zwei Tabellen gegeben, deren Spaltenköpfe so aussehen:
feld1 feld2 feld3 ID feld4 feld5
und
ID
In der zweiten Tabelle befindet sich in der einzigen Spalte ID eine Liste von IDs. Nun möchte ich aus der ersten Tabelle alle diejenigen Zeilen herausfiltern, deren ID in der zweiten Tabelle aufgeführt ist.
Wie kann man das anstellen?
muß es wirklich awk sein? Mit perl wäre das trivial. 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
Dr. Jürgen Vollmer, Dienstag 10 November 2009:
muß es wirklich awk sein? Mit perl wäre das trivial.
Ich drücke mich noch immer davor, Perl zu lernen. Von awk habe ich wenigstens eine rudimentäre Vorstellung. Wie würdest Du es im Perl darstellen? Danke+Gruß! PS: wir sollten Wetten abschließen: Wenn ich mir bis Weihnachten nicht wenigstens ein Perl-Buch gekauft habe, muß ich hier ne Runde ausgeben... ;) -- 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
Hi =?iso-8859-1?q?Dr.! On Di, 10 Nov 2009, =?iso-8859-1?q?Dr. J=FCrgen Vollmer?= wrote: (Argl, ist kmail eigentlich tatsächlich so kaputt und kann kein qp-encoden?)
Am Dienstag 10 November 2009 09:47:16 schrieb Andre Tann:
Es seien zwei Tabellen gegeben, deren Spaltenköpfe so aussehen:
feld1 feld2 feld3 ID feld4 feld5 und ID
In der zweiten Tabelle befindet sich in der einzigen Spalte ID eine Liste von IDs. Nun möchte ich aus der ersten Tabelle alle diejenigen Zeilen herausfiltern, deren ID in der zweiten Tabelle aufgeführt ist.
Wie kann man das anstellen?
muß es wirklich awk sein? Mit perl wäre das trivial.
In awk ist es auch trivial. awk hat den großen Vorteil der Portabilität (ist in Posix vorgeschrieben, bei Perl ist das nicht so) awk 'NR==FNR {a[$1]} $4 in a{print}' file_id file2.txt Reihenfolge der Argumente ist wichtig, zuerst die Datei mit den IDs angeben, dann den Rest. Perl hat halt den Vorteil der mächtigen RE, aber in diesem Fall geht es sicherlich genauso einfach mit awk. Mit freundlichen Grüßen Christian -- • The fact that ACPI was designed by a group of monkeys high on LSD, and is some of the worst designs in the industry obviously makes running it at _any_ point pretty damn ugly. Torvalds, Linus (2005-07-31). -- 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
Christian Brabandt, Dienstag 10 November 2009:
awk 'NR==FNR {a[$1]} $4 in a{print}' file_id file2.txt
Hm, das gibt mir die entsprechenden Feder aus, deren ID in file_id vorkommt, nicht aber den Rest der Zeile. -- 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
Hi Andre! On Di, 10 Nov 2009, Andre Tann wrote:
Christian Brabandt, Dienstag 10 November 2009:
awk 'NR==FNR {a[$1]} $4 in a{print}' file_id file2.txt
Hm, das gibt mir die entsprechenden Feder aus, deren ID in file_id vorkommt, nicht aber den Rest der Zeile.
Bitte Beispiel posten. Tut hier wunderbar: #v+ chrisbra t41:~/awk [1024]% cat file_id.txt 1 2 3 4 5 chrisbra t41:~/awk [1025]% cat file1.txt feld1 feld2 feld3 1 feld4 feld5 feld1 feld2 feld3 2 feld4 feld5 feld1 feld2 feld3 3 feld4 feld5 feld1 feld2 feld3 4 feld4 feld5 feld1 feld2 feld3 5 feld4 feld5 feld1 feld2 feld3 6 feld4 feld5 feld1 feld2 feld3 7 feld4 feld5 feld1 feld2 feld3 8 feld4 feld5 feld1 feld2 feld3 9 feld4 feld5 feld1 feld2 feld3 10 feld4 feld5 feld1 feld2 feld3 11 feld4 feld5 chrisbra t41:~/awk [1026]% awk 'NR==FNR {a[$1]} $4 in a{print}' file_id.txt file1.txt feld1 feld2 feld3 1 feld4 feld5 feld1 feld2 feld3 2 feld4 feld5 feld1 feld2 feld3 3 feld4 feld5 feld1 feld2 feld3 4 feld4 feld5 feld1 feld2 feld3 5 feld4 feld5 chrisbra t41:~/awk [1027]% #v- regards, Christian -- • My personal opinion of Mach is not very high. Frankly, it's a piece of crap. It contains all the design mistakes you can make, and even managed to make up a few of its own. Torvalds, Linus -- 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, 10 Nov 2009, Christian Brabandt schrieb:
chrisbra t41:~/awk [1026]% awk 'NR==FNR {a[$1]} $4 in a{print}' file_id.txt file1.txt
Hier noch die (ausführliche) Perl-Variante: ==== #!/usr/bin/perl -w use strict; my @IDS; while(<>) { chomp; push(@IDS, $_); last if eof; } while(<>) { chomp; my $i = (split)[2]; print "$_\n" if grep { $i eq $_ } @IDS; } ==== (oder vorletzte Zeile: grep { $i eq $_ } @IDS and print "$_\n"; oder if( grep { $i eq $_ } @IDS ) { print "$_\n"; } je nachdem was man besser lesen kann ;) Perl hat eben AFAIR keinen 'in' Operator, zumindest nicht, wenn man nicht mit Modulen arbeitet. -dnh -- Linux is not a desktop OS for people whose VCRs are still flashing "12:00". -- Paul Tomblin -- 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
Andre Tann wrote:
eine Frage zu awk: Es seien zwei Tabellen gegeben, deren Spaltenköpfe so aussehen:
feld1 feld2 feld3 ID feld4 feld5
und
ID
In der zweiten Tabelle befindet sich in der einzigen Spalte ID eine Liste von IDs. Nun möchte ich aus der ersten Tabelle alle diejenigen Zeilen herausfiltern, deren ID in der zweiten Tabelle aufgeführt ist.
Wie kann man das anstellen?
Ein "einfache" Möglichkeit (fallst die IDs "unique" genug sind) könnte auch: grep -v -f IDFile File sein. (liefert alle Zeilen aus File in denen die Pattern aus IDFile nicht vorkommen) Aber dazu müsste man deine Daten kenne. Ansonsten: man perl -;) Andreas -- 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
Kyek, Andreas, VF-DE schrieb:
Andre Tann wrote:
eine Frage zu awk: Es seien zwei Tabellen gegeben, deren Spaltenköpfe so aussehen:
feld1 feld2 feld3 ID feld4 feld5
und
ID
In der zweiten Tabelle befindet sich in der einzigen Spalte ID eine Liste von IDs. Nun möchte ich aus der ersten Tabelle alle diejenigen Zeilen herausfiltern, deren ID in der zweiten Tabelle aufgeführt ist.
Wie kann man das anstellen?
Ein "einfache" Möglichkeit (fallst die IDs "unique" genug sind) könnte auch:
grep -v -f IDFile File
sein. (liefert alle Zeilen aus File in denen die Pattern aus IDFile nicht vorkommen)
... wenn sie aber vorkommen sollen (s.oben), dann halt ohne "-v" just my 2ct cu jth -- 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
Joerg Thuemmler, Dienstag 10 November 2009:
Ein "einfache" Möglichkeit (fallst die IDs "unique" genug sind) könnte auch:
grep -v -f IDFile File
sein. (liefert alle Zeilen aus File in denen die Pattern aus IDFile nicht vorkommen)
...
wenn sie aber vorkommen sollen (s.oben), dann halt ohne "-v"
Funktioniert auf keinen Fall, da die IDs Zahlen sind, die auch in den anderen Spalten vorkommen können. Aber wie Andreas schon schrieb, wären die IDs unique genug, dann würde das funktionieren. 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
Das sollte mit dem Befehl join ( sortierte Listen vorausgesetzt ) machbar sein. -- Wolfgang-- 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)
-
Andre Tann
-
Christian Brabandt
-
David Haller
-
Dr. Jürgen Vollmer
-
Joerg Thuemmler
-
Kyek, Andreas, VF-DE
-
Wolfgang Schlueschen