Listen miteinander vergleichen und Einträge aus Liste B automatisch aus A entfernen

ISOstar

Lt. Commander
Registriert
Aug. 2002
Beiträge
1.056
Hi Leute,

ich stehe gerade vor einem für mich unlösbaren Problem.

Folgendes:

Ich habe zwei CSV Listen mit jeweils einer Spalte

Liste 1 beinhaltet Emailadressen

Liste 2 beinhaltet Emaildresse die ebenfalls auch in 1 vorkommen.

Nun möchte ich die beiden Listen automatisch miteinander vergleichen lassen und die Emailadresse aus Liste 2 sollen aus Liste 1 entfernt werden. Idealerweise sollte automatisch eine Liste 3 geschrieben werden.

Habe es mit dem comm Befehl probiert in dem ich folgende Eingabe im Terminal genutzt habe

comm -2 -3 /Desktop/1.csv /Desktop/2.csv >> /Desktop/3.csv

Die Datei wird geschrieben, aber Liste 3.csv ist identisch mit 1.csv

Kann mir hier jemand helfen? Habe kein Excel zur Hand, nur Numbers

​Vielen Dank
 
Also ich weiss jetzt wann es nicht geht:
Wenn in Liste 2 Adressen sind die nicht in 1 sind (konkret, die erste Zeile). Warum das aber nicht durch -2 abgefangen wird weiss ich nicht.
 
Versuch es mal noch mit "-i"
 
Und das ist bei mir der Fall, dass die Adressen sowohl in Datei 1 und 2 sind.
Ich hab ja schon angefangen von Hand auszufiltern, aber bei über 1000 Einträgen wird das zur Odyssee.

Ich habe echt keine Ahnung wie ich das vernünftig regeln kann. Mir ist noch in den Sinn gekommen es mit Numbers zu machen, sodass ich in Spalte A eben die kompletten Einträge aus Liste 1 kopiere und in Spalte B die Einträge aus Liste 2. Aber wie bekomme ich die Einträge aus Liste 2 in Spalte A entfernt?

​@Cool Master
Könntest du evtl. etwas konkreter werden? Stehe gerade auf dem Schlauch :)
 
Unter Linux wird mir in der Konsole angezeigt, ob "comm" nen Fehler meldet bzgl. unsortierter Liste.
Nachdem ich mal nen "sort liste2.csv" über Liste 2 gejagt hab (mit >> in neue Liste2_sort) war der Fehler dann weg (Buchstaben waren vor Zahlen) und die Sortierung hat geklappt.

Kannst du evtl. ne Testliste erstellen und die Konsolenausgaben posten? (Irgendwelche Fantasieadressen).

Hier meine 2 Listen (oben Liste 1 unten Liste 2):

Code:
test1@test.de
test2@testttt.com
ttess3@gg.us
test444@ffff.to
test5556@hhff.se


test0@ggsdf.dde
test1@test.de
test2@testttt.com
test5556@hhff.se

Dein Code -->
"comm: die Datei 1 ist nicht sortiert"

sort Liste1.csv >> Liste1_neu.csv
etc.


Sortiert:

Code:
test1@test.de
test2@testttt.com
test444@ffff.to
test5556@hhff.se
ttess3@gg.us


test0@ggsdf.dde
test1@test.de
test2@testttt.com
test5556@hhff.se

Und Liste 3:

Code:
test444@ffff.to
ttess3@gg.us
 
Zuletzt bearbeitet:
ISOstar schrieb:
​@Cool Master
Könntest du evtl. etwas konkreter werden? Stehe gerade auf dem Schlauch :)

ALs operator noch "-i" hinzufügen, damit wird Groß- Kleinschreibung ignoriert.
 
Klappt nicht.

Gibt es für solche Fälle denn nicht ein Tool bzw ein Programm? Ich werde echt noch wahnsinnig und denke mir, dass es bestimmt nicht soooo schwer ist, wenn man weiß wie man vorgehen muss. Excel/Numbers ist nur leider überhaupt nicht meine Stärke.

Sehe es schon kommen, dass es heute eine Nachtschicht mit von Hand filtern gibt :(
 
comm -i -2 -3 sort1neu.csv sort2neu.csv >> test3.csv
comm: Ungültige Option -- i
„comm --help“ liefert weitere Informationen.

So oder wie genau? -i gibt es bei mir wohl nicht (auch nicht in der Hilfe angeführt).
 
Nochmal zum besseren Verständnis

Ich habe eine Liste 1 mit Emailadressen aus einem Newsletter. Dort stehen tausende Emailadressen drin. Nun habe ich mir die Bounces angeschaut und diese als CSV exportiert, damit ich diese aus dem Verteiler nehmen kann. Bouncer sind um die 1.000 Empfänger.

Somit haben wir

Liste 1.csv --> Komplette Liste mit allen Newsletterempfänger
Liste 2.csv --> enthält ausschließlich NUR die Adressen der Bounces

Somit sind die Emailadressen der Bounces AUCH in der kompletten Liste enthalten.

Ich habe schon mit Numbers experimentiert und in Spalte A alle Newsletterempänger kopiert und eingefügt und das selbe in Spalte B für die Bounces. Aber wie sage ich Numbers dann, dass er alle Einträge aus Spalte B in A entfernen möchte? Da bin ich echt total aufgeschmissen und habe keinen blassen Schimmer wie ich da vorgehen muss.
 
"man comm"

-i Case insensitive comparison of lines.
 
comm -2 -3 -i 1.csv 2.csv >> 3.csv hat bei mir zwar ohne Fehler funktioniert, aber die Liste ist immer noch identisch
 
Deine erste Idee mit comm sollte da aber funktionieren.
Oder ist in meinem Beispiel oben was anders als bei deinen Emailadressen?

Was du noch testen kannst:

Code:
tr '[:upper:]' '[:lower:]' < Liste1.csv > Liste1_neu.csv

Das gleiche mit Liste 2.
tr bringt alles auf lowercase.

Dann sort wie oben.
Danach nochmal dein comm Befehl.

Wenn das nicht geht weiss ich leider gerade nicht weiter. Vllt. weiss da jmd mehr.

EDIT: Ok -i gibt es bei mir nicht. Sind wohl verschiedene comm Versionen.
"GNU coreutils 8.21"
Komisch das das aussortieren bei mir wohl geht. :(
 
Ok, es hat sich erledigt.

Am Ende hat es hiermit funktioniert:

fgrep -vf /Desktop/2.csv /Desktop/1.csv >> /Desktop/3.csv

Danke an alle die versucht haben zu helfen. Ein echter Horror sowas...
 
Hallo ISOstar,

anbei ein funktionierender Weg für Dateien, die im Grunde plain text enthalten - .csv scheint ja ein solches
Format zu sein, sollte also keine Probleme machen.

1) Die Files zusammenfügen:

Mit der Konsole geht das sehr schnell, einfach einen Ordner anlegen, alle Files reintun und diesen Befehl

Code:
 for i in *; do cat "$i" && echo ""; done > Gesamt.csv

ausführen.

2) Für zwei Dateien jetzt nur noch den Befehl

Code:
 sort Gesamt.csv | uniq -d > Schnitt.csv

ausführen und fertig. Die ausgegebene Datei enthält die Einträge, die in beiden Dateien enthalten sind (vorausgesetzt die Emails tauchen nur einfach in jeder Datei auf, das kann man aber ggf. vorher mit uniq noch sicherstellen. Das ganze funktioniert so im übrigen auch für mehr als zwei Dateien, für n Dateien dazu dann statt dem zweiten Befehl diesen hier

Code:
 sort Gesamt.csv | uniq -c | awk '$1 == n { print $2 }' > Schnitt.csv

falls der Eintrag in allen Dateien stehen soll, wenn es reicht wenn er in mehr als einer Datei steht, dann diesen hier:

Code:
 sort Gesamt.csv | uniq -c | awk '$1 > 1 { print $2 }' > Schnitt.csv

Habe es eben ausprobiert, das funktioniert ganz wunderbar im Terminal (OSX ElCapitan PB4); sollte auch in älteren Versionen funktionieren.
 
Zuletzt bearbeitet: (Änderung von .txt auf .csv, funktioniert Probiertermaßen wunderbar im Terminal)
Zurück
Oben