Re: Größte Schnittmenge von mehreren Date ien

2005-08-08 Diskussionsfäden Christoph Bersch

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

2005-08-08 Diskussionsfäden Tilo Schwarz

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

2005-08-07 Diskussionsfäden Tilo Schwarz

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

2005-08-07 Diskussionsfäden Tilo Schwarz

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

2005-08-07 Diskussionsfäden Tilo Schwarz

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

2005-08-06 Diskussionsfäden Tilo Schwarz
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

2005-08-06 Diskussionsfäden Tilo Schwarz
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

2005-08-05 Diskussionsfäden Christoph Bersch

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

2005-08-05 Diskussionsfäden Sven Lauritzen
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

2005-08-04 Diskussionsfäden Christoph Bersch

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

2005-08-04 Diskussionsfäden Sven Lauritzen
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)