2 Dateien zeilen-weise vergleichen

L

L0rd

Mitglied
Hallo an Alle

ich habe 2 Dateien, einmal ne Gesamtliste gliste und ne Neuliste nliste
in beiden stehen Benutzernamen und zwar zeilenweise, so ungefähr:



gliste
Code:
nikster77
wolfgang
xanti
belubaba
rikola
sniffer
hoernchen
onlineuser
.
.
.
.
ca. 1600 Zeilen:)



nliste
Code:
nikster77
wolfgang
auskenner
belubaba
rikola
bazzty
onlineuser
heuri
.
.
.
.


jetzt sollte die gliste vervollständigt werden mit Einträgen aus nliste welche die gliste noch nicht hat. Das wären dann:

auskenner
bazzty
heuri


Danach sollte die gliste so aussehen:
Code:
nikster77
wolfgang
xanti
belubaba
rikola
sniffer
hoernchen
onlineuser
auskenner
bazzty
heuri
.
.
.

ich habe es schon mit diff und compare versucht, aber da kriege ich keine brauchbare Ergebnisse. Und google spuckt nur verzeichnis vergleiche und son Zeug raus X(

Hat jemand ne Idee wie es gehen würde ?
Für paar Zeilen Code würde ich auch sehr dankbar :D
 
Interessante Listen führst Du ;)

Auf die Schnelle würde ich folgendes vorschlagen:

Code:
for i in $(cat nlist); do if [ $(grep -c $i glist) -eq 0 ]; then echo $i >> tlist ; fi; done; cat tlist >> glist; rm tlist

Gruss, Xanti
 
Zuletzt bearbeitet:
Tja, jetzt seit ihr auf meiner Liste :rtfm:
genauer meiner Testliste:)

ich hab's mit comm auch probiert, aber ich wusste net, dass die Listen vorher sortiert sein müssen,
sonst kommt nichts brauchbares raus. Hier:
Code:
comm -13 gliste nliste | cat >> gliste

wobei die Lösung von Xanti kann man einfach drauf los anwenden. Danke Xanti ! Danke Sir Auron !

Da wir bei Listen sind, fällt mir noch ein, dass ich
die mehrfach Einträge rasulöschen wollte
(so dass jeder Benutzer nur einmal vorkommt und nicht 2 oder 3 fach in der Liste)
sowie die Zeilen die gänsefüsschen enthalten und leere Zeilen. Da kennt ihr bestimmt was ;)
 
Ich denke mal, dass Du mit uniq und grep das kleine Problem lösen wirst.

Gruss, Xanti
 
:) naja ich bin kein Freund von sortieren, deswegen kann ich uniq nicht anwenden :(
 
Code:
touch newlist; for i in $(cat glist); do if [ $(grep -c $i newlist) -eq 0 ]; then echo $i >> newlist; fi; done; mv newlist glist

Gruss, Xanti
 
Hallo
Nur so zur Ergänzung für ähnliche Probleme:
Größte gemeinsame Schnittmenge beliebig vieler Dateien:
Code:
perl -ne 'BEGIN{$c=$#ARGV} print $_ if ++$found{$_} > $c' first.txt second.txt more.txt

Wills du das was nicht in allen Dateien vorkommt:
Code:
perl -ne 'BEGIN{$c=$#ARGV} print $_ unless ++$found{$_} > $c' first.txt second.txt more.txt

Das geht natürlich nur, wenn die Einträge innerhalb einer Datei nicht doppelt vorkommen.

Um eine Datei direkt zu bereinigen, also alle doppelten Einträge und Leerzeilen zu entfernen geht das auch mit perl (mit sed und uniq natürlich auch)
Hier die Perlvariante, ohne dass sortiert wird.
Das kann bei größeren Datenmengen nützlich sein.
Code:
perl -pi -e 's/$_// if((++$found{$_}>1)||(/^$/));' test
Aber hier wird trotzdem mindestens die Speichermenge für alle eindeutigen Elemente benötigt. Das ist beim Sortieren aber allgemein so. Hier werden jedenfalls doppelte Elemente nicht gespeichert, was ein wenig weniger Platz braucht. Eins so bereinigte Datei sortiert sich dann schneller.

Um Hochkommas zu entfernen ist wohl tr am schnellsten.
geht aber auch mit perl direkt
Code:
perl -pi -e s!"!!g' test

Zum Schluss noch einen Perleinzeiler, der aus einer im obigen Sinne bereinigten Datei alle Elemente findet, die in der ersten Datei nicht vorkommen und daraus eine Schnittmenge bildet:
Code:
perl -ne '(($h{$_}.= @ARGV) =~ /10$/) ? print : 1' Datei1 Datei2 >Ausgabedatei

Gruß Wolfgang
 
Zuletzt bearbeitet:
Das mit sortieren, filtrieren und was ich noch so hier gefragt habe,
habe ich schon in der Zeit selbs hingekriegt.

das einzige was ich noch nicht hingekriegt habe, wäre dann,
die Zeilen löschen die wenniger als 6 Zeichen haben.
(Benutzername muss mind. 6 Zeichen lang sein)

hab schon was gebastelt mit sed aber das schnitt in jeder zeile die ersten 5 zeichen ab :think:
 
Hallo

sed -e '/.\{6,\}/!d' datei
;)

Bei GNU sed geht sogar die Option -i
sed -i -e '/.\{6,\}/!d' datei
Gruß Wolfgang
 
öhm naja,

ka, warum mein name da gerade auftaucht ^^
hab auch gerade keine Zeit zum lesen...
.....
 
hi,

das gute alte sort tut's nicht?:

Code:
sort -u gliste nliste > /tmp/xliste && mv /tmp/xliste gliste



der tom
 
hi,

das gute alte sort tut's nicht?:

Code:
sort -u gliste nliste > /tmp/xliste && mv /tmp/xliste gliste



der tom
Meine gute alte Glaskugel tut's auch nicht.

Gruß Wolfgang
PS Trotzdem schön, dass wir mal darüber geredet haben. ;)
 
Zurück
Oben