Re: Größte Schnittmenge von mehreren Date ien
Tilo Schwarz wrote: Wir haben n Rechner und damit n Dateien und wollen wissen, welche Pakete in allen n Dateien enthalten sind, richtig? Richtig Seien die Dateinamen d1.txt, ..., d5.txt (also n=5), dann würde ich das so machen: sort d[1-5].txt | uniq -c | grep 5 | cut -c9- Yuppie, das ist natürlich die weitaus elegantere Variante! Besten Dank :-) Christoph -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: Größte Schnittmenge von mehreren Date ien
On Sun, 07 Aug 2005 20:06:43 +0200, Eduard Bloch [EMAIL PROTECTED] wrote: [...] Args. Das war die letzte ungetestete Version. Die andere genannte Alternative tut, was sie soll: perl -ne 'sub BEGIN{$a=$#ARGV} print $_ if ++$seen{$_} $a' a.txt b.txt c.txt 3 1 Interessant, wieder was gelernt und zugegebenermaßen ist es wirklich kurz. Du hattest ja weiter oben die Python-Variante mit langsamer in Verbindung gebracht ;-), also schaun wir mal ... seq 200 | split -l 20cat inter.py from sys import argv, stdout from sets import Set gen = (Set(file(f)) for f in argv[1:]) inter = reduce(lambda x,y: x y, gen) stdout.writelines(inter) time perl -ne 'sub BEGIN{$a=$#ARGV} print $_ if ++$seen{$_} $a' xa* /dev/null real0m9.663s user0m8.669s sys 0m0.725s time perl -ne 'sub BEGIN{$a=$#ARGV} print $_ if ++$seen{$_} $a' xa* /dev/null real0m9.620s user0m8.661s sys 0m0.712s time python2.4 inter.py xa* /dev/null real0m4.914s user0m4.284s sys 0m0.495s [EMAIL PROTECTED]:~/tmp time python2.4 inter.py xa* /dev/null real0m4.871s user0m4.294s sys 0m0.486s Nun ja, ist ja nicht wirklich verwunderlich, da ja bei den beiden verschiedenen Algorithmen die Leere Menge klar im Vorteil ist. Also sind wir mal nicht so und probieren folgendes: 10 Files wobei je zwei aufeinanderfolgende Files zu 90% gleich sind: for n in `seq 0 9`; do seq ${n} 1${n} x$n.txt; done time perl -ne 'sub BEGIN{$a=$#ARGV} print $_ if ++$seen{$_} $a' x*.txt | wc 10001 10001 60007 real0m3.373s user0m3.126s sys 0m0.119s time perl -ne 'sub BEGIN{$a=$#ARGV} print $_ if ++$seen{$_} $a' x*.txt | wc 10001 10001 60007 real0m3.315s user0m3.120s sys 0m0.128s time python2.4 inter.py x*.txt | wc 10001 10001 60007 real0m4.346s user0m3.819s sys 0m0.432s time python2.4 inter.py x*.txt | wc 10001 10001 60007 real0m4.332s user0m3.797s sys 0m0.444s Also wenn Du mich fragst, ist die Python-Variante gar nicht so langsam und skaliert mit steigender Zahl von Files immer besser. Ist aber auch kein Wunder, da der Algorithmus ja auch anders ist. Viele Grüße, Tilo -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: Größte Schnittmenge von mehreren Date ien
On Sun, 07 Aug 2005 01:33:39 +0200, Eduard Bloch [EMAIL PROTECTED] wrote: Moin Tilo! Tilo Schwarz schrieb am Sonntag, den 07. August 2005: Oder: from sys import stdout from sets import Set files = [/tmp/pc1.pkgs, /tmp/pc2.pkgs] sets = [Set(file(f).readlines()) for f in files] intersection = reduce(lambda x,y: x y, sets) stdout.writelines(intersection) Viel zu lang, und langsamer als perl -ne 'print $_ if $seen{$_}; $seen{$_}=1' file1 file2 Ich weiß nicht, ob Du das OP gelesen hast, da ging's um mehrere (n 2) Dateien. Das hier tut da wohl nich ... Viele Grüße, Tilo -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: Größte Schnittmenge von mehreren Date ien
On Sun, 07 Aug 2005 01:33:39 +0200, Eduard Bloch [EMAIL PROTECTED] wrote: Moin Tilo! Tilo Schwarz schrieb am Sonntag, den 07. August 2005: Oder: from sys import stdout from sets import Set files = [/tmp/pc1.pkgs, /tmp/pc2.pkgs] sets = [Set(file(f).readlines()) for f in files] intersection = reduce(lambda x,y: x y, sets) stdout.writelines(intersection) Viel zu lang, und langsamer als perl -ne 'print $_ if $seen{$_}; $seen{$_}=1' file1 file2 BTW, meine bevorzugte Lösung ist sowieso sort file*.txt | uniq -c | grep 5 | cut -c9- bei 5 Files. Viele Grüße, Tilo -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: Größte Schnittmenge von mehreren Date ien
Moin Eduard! Moin Tilo! Du aussm Norden ;-)? sort file*.txt | uniq -c | grep 5 | cut -c9- bei 5 Files. Das kostet aber Speicher und die Laufzeit skaliert nicht gut. Theoretisch ja, praktisch? Und mit UTF-8-Locale kannst du sort und grep eh vergessen. Da es hier nur auf Gleichheit ankommt, sollte sort | uniq doch trotzdem funktionieren (untested ...) Perl-Version: perl -ne 'print $_ if ++$seen{$_} $#ARGV' *.txt ... egal wie viele Dateien. Kann man noch mit einmaliger Berechnung der Anzahl beschleunigen. Hmm ... %cat a.txt 1 2 3 4 %cat b.txt 1 2 3 %cat c.txt 3 5 1 %perl -ne 'print $_ if ++$seen{$_} $#ARGV' a.txt b.txt c.txt 1 2 3 3 5 1 Schnittmenge ist aber 1 3 Viele Grüße, Tilo -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: Größte Schnittmenge von mehreren Date ien
On Fri, 05 Aug 2005 12:28:45 +0200, Christoph Bersch [EMAIL PROTECTED] wrote: [...] Wenn jemand noch Verbesserungsvorschläge für das Skript hat (keine 2 temporäre Dateien, etc) immer her damit! Hi, mir ist zwar noch nicht klar, was Du mit größter Schnittmenge meinst, aber los geht's: Wir haben n Rechner und damit n Dateien und wollen wissen, welche Pakete in allen n Dateien enthalten sind, richtig? Seien die Dateinamen d1.txt, ..., d5.txt (also n=5), dann würde ich das so machen: sort d[1-5].txt | uniq -c | grep 5 | cut -c9- Viele Grüße, Tilo -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: Größte Schnittmenge von mehreren Date ien
On Thu, 04 Aug 2005 17:56:23 +0200, Ames Andreas [EMAIL PROTECTED] wrote: Christoph Bersch wrote: Hallo, wie kann ich die größte Schnittmenge von mehreren Dateien ermitteln? 1) Erzeuge die Paketdateien mit: dpkg --get-selections | grep '[[:space:]]install$' | cut -f 1 /tmp/pc1.pkgs usw. (die Dateinamen spielen keine Rolle). 2) Benutze folgendes Pythonscript: #script files = [/tmp/pc1.pkgs, /tmp/pc2.pkgs] files_per_line = {} for f in files: for l in file(f): # nicht sehr effizient aber kurz files_per_line[l] = files_per_line.setdefault(l, 0) + 1 flen = len(files) for l, i in files_per_line.items(): if i == flen: print l, #/script Oder: from sys import stdout from sets import Set files = [/tmp/pc1.pkgs, /tmp/pc2.pkgs] sets = [Set(file(f).readlines()) for f in files] intersection = reduce(lambda x,y: x y, sets) stdout.writelines(intersection) Viele Grüße, Tilo -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: Größte Schnittmenge von mehreren Date ien
Hi! Michelle Konzack wrote: Am 2005-08-04 16:46:50, schrieb Christoph Bersch: wie kann ich die größte Schnittmenge von mehreren Dateien ermitteln? Konkret geht es darum in einem Netzwerk zu ermitteln, welche Pakete auf _jedem_ Rechner installiert sind. Wenn Du eine Dateiliste von jedem Server hast, kannste folgendes machen: grep -f server1.list server2.list gleiche1.list grep -f server3.list gleiche1.list gleiche2.list grep -f server4.list gleiche2.list gleiche3.list grep -f server5.list gleiche3.list gleiche4.list grep -f server6.list gleiche4.list gleiche5.list Was dann in gleiche5.list übrig bleibt, ist auf allen Servern vorhanden Habe es jetzt mit folgendem Skript gemacht: #!/bin/sh PACKAGEDIR=pap_packages TMPFILE=$PACKAGEDIR/pap_packages.tmp TMPFILE2=$PACKAGEDIR/pap_packages.tmp2 COMMONPACKFILE=$PACKAGEDIR/pap_packages.install # temporäre Datei löschen cat /dev/null $TMPFILE for file in $PACKAGEDIR/pap*_packages.install do # # Wenn die temporäre Datei noch leer ist, den gesamten # Inhalt der ersten Datei reinschreiben if [ ! -s $TMPFILE ]; then cat $file $TMPFILE # # Andernfalls Inhalte vergleichen else grep -x -f $TMPFILE $file $TMPFILE2 cat $TMPFILE2 $TMPFILE fi done cat $TMPFILE $COMMONPACKFILE rm $TMPFILE $TMPFILE2 # Wenn jemand noch Verbesserungsvorschläge für das Skript hat (keine 2 temporäre Dateien, etc) immer her damit! Danke und Grüße Christoph -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: Größte Schnittmenge von mehreren Date ien
Guten Tag! Am Donnerstag, den 04.08.2005, 22:55 +0200 schrieb Michelle Konzack: Stell Dich nicht so an! :-) man grep grep --word-regexp -f server1.list server2.list gleiche1.list grep --word-regexp -f server3.list gleiche1.list gleiche2.list grep --word-regexp -f server4.list gleiche2.list gleiche3.list grep --word-regexp -f server5.list gleiche3.list gleiche4.list grep --word-regexp -f server6.list gleiche4.list gleiche5.list $ echo libfoo-dev test1 $ echo libfoo test2 $ grep --word-regexp -f test2 test1 libfoo-dev :-P Um Deinem Verweis auf die Manpage zu folgen: -x bringt's! $ grep -x -f test2 test1 Das hat der OP inzwischen übrigens auch herausgefunden. Die Zeilen in test2 werden dabei als reguläre Ausdrücke behandelt. Das könnte bei Paketen wie automake1.4 theoretisch knallen, wenn es auch ein Paket automake104 o. ä. gibt. Für diese Problemstellung ist das wohl irrelevant. Man sollte es jedoch im Blick behalten, bevor man das in ernste Programme einbaut. Gruß Sven -- Sven Lauritzen mailto: the minus pulse at gmx dot net pub 1024D/95C9A892 sub 1024g/D30E490F ABCDEFGHIJKLM Fp 2FA9 FC9B 078C 5BC7 87DC 0B0D 2329 94F6 95C9 A892 NOPQRSTUVWXYZ -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Größte Schnittmenge von mehreren Date ien
Hallo, wie kann ich die größte Schnittmenge von mehreren Dateien ermitteln? Konkret geht es darum in einem Netzwerk zu ermitteln, welche Pakete auf _jedem_ Rechner installiert sind. Dafür wollte ich zuerst mit dpkg --get-selections | grep '[[:space:]]install$' auf jedem Rechner die installierten Pakete bestimmen und mir dann ausgeben lassen, welche Pakete in jeder Datei enthalten sind. Mit diff kenne ich mich kein Stück aus, und bin mit den zugehörigen man-pages auch nicht weiter gekommen. Hat jemand einen Tipp für mich, wie ich das elegant lösen kann? Danke Christoph -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: Größte Schnittmenge von mehreren Date ien
Hallo! Am Donnerstag, den 04.08.2005, 22:04 +0200 schrieb Michelle Konzack: Wenn Du eine Dateiliste von jedem Server hast, kannste folgendes machen: grep -f server1.list server2.list gleiche1.list grep -f server3.list gleiche1.list gleiche2.list grep -f server4.list gleiche2.list gleiche3.list grep -f server5.list gleiche3.list gleiche4.list grep -f server6.list gleiche4.list gleiche5.list Was dann in gleiche5.list übrig bleibt, ist auf allen Servern vorhanden Ich hab's ausprobiert, es hätte mich gewundert, wenn das funktioniert hätte. $ echo a test1 $ echo aa test2 $ grep -f test1 test2 aa Das ist offensichtlich flasch. Gruß Sven -- Sven Lauritzen mailto: the minus pulse at gmx dot net pub 1024D/95C9A892 sub 1024g/D30E490F ABCDEFGHIJKLM Fp 2FA9 FC9B 078C 5BC7 87DC 0B0D 2329 94F6 95C9 A892 NOPQRSTUVWXYZ -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)