Was ist der einfachste Weg, um Zeilen aus einer Datei zu entfernen, die mit Zeilen aus einer anderen Datei übereinstimmen? Zum Beispiel, wenn ich die folgenden Dateien habe:
file1.csv:
u2@domain.com
file2.csv:
1,u1@domain.com,somehash1
2,u2@domain.com,somehash2
3,u3@domain.com,somehash3
Als Ergebnis hätte ich gerne file3.csv :
1,u1@domain.com,somehash1
3,u3@domain.com,somehash3
Was ist der schnellste Weg, um diese Aufgabe zu lösen? Diese Dateien sind einige GB groß.
Antworten:
grep -v -F -f file1.csv file2.csv > file3.csv
scheint das einfachste zu sein. Sie sollten jedoch zuerst Leistungstests mit kleineren Dateien durchführen. (Ich stimme dem Kommentar von soandos zu, dass solch große Dateien möglicherweise eine dedizierte Lösung benötigen.)quelle
cat file2.csv | fgrep -vf file1.csv > file3.csv
cat
. Sie könnten auch verwenden< file2.csv | fgrep -vf file1.csv > file3.csv
.-x
Option.Sie müssen über genügend Speicher verfügen, um Datei1 auf einmal einlesen zu können.
Hier ist eine andere Option:
join
Aus der Manpage "Wichtig: DATEI1 und DATEI2 müssen in den Verknüpfungsfeldern sortiert sein." Berücksichtigen Sie dies bei Ihrer Entscheidung.
quelle
Sie könnten jede Zeile in Datei1 durchlaufen und passende Zeilen aus Datei2 abrufen?
Ungetestet.
Edit: Getestet, scheint OK zu funktionieren. Stellen Sie einfach sicher, dass in Datei1 ein Zeilenumbruch vorhanden ist.
quelle
set -x
undset -v
und sah, dass eine neue Zeile am Ende des Strings war, nach dem gesucht wurde, also fügte ich die hinzu%?
und es funktionierte ... Und Sie haben Recht, dass dies Datei2 einmal für jede Zeile in Datei1 verarbeitet, aber sicherlich die einzige Ein anderer Ansatz wäre, file1 einmal für jede Zeile in file2 zu lesen. Das OP sagte, es handele sich bei den Dateien um "jeweils wenige Konzerte", daher bin ich mir nicht sicher, wie groß der Unterschied zwischen den Dateigrößen ist.Muss file1.csv unverändert bleiben?
Ich weiß nicht, wie viel Speicher es verbraucht. AFAIK, es testet jedes Mal die Datei mit dem gesamten Wert (2.csv).
Wenn die Eingabe sortiert ist und auch die Muster sortiert sind, können Sie eine schnellere Lösung implementieren.
quelle
Stellen Sie sicher, dass file3.csv existiert (und leer ist)
Et voilá!
quelle
Hierfür ist keine "codierte Lösung" erforderlich. Wenn Sie die Zeilen zuerst sortieren, wird die algorithmische Komplexität um mehrere Größenordnungen reduziert.
In dieser Antwort wird die Leistung sowohl in Bezug auf die CPU-Zeit als auch in Bezug auf den Arbeitsspeicher verbessert:
https://stackoverflow.com/questions/4366533/remove-lines-from-file-which-appear-inother-file
quelle