Wie entferne ich Zeilen, die in einer Datei enthalten sind, aus einer anderen Datei?

10

Ich habe zwei Listen, eine vollständige Liste und eine unvollständige Liste. Ich möchte ein Bash-Skript, das die vollständige Liste nach Zeilen durchsucht, die im Teil enthalten sind. Wenn dies der Fall ist, werden sie aus der vollständigen Liste entfernt. Kann jemand helfen?

Ameisenbauer
quelle

Antworten:

13

grepkann mehrere Muster aus einer Datei lesen, eines pro Zeile. Kombinieren Sie diese Option mit den Optionen, -vum nicht übereinstimmende Zeilen auszugeben und -FZeichenfolgen anstelle von Regex zuzuordnen und -xdie Übereinstimmung der gesamten Zeile zu fordern.

grep -Fvx -f partial.list complete.list >remaining.list &&
mv remaining.list complete.list

Offensichtlich ist die zweite Befehlszeile nur, wenn Sie die Datei mit der vollständigen Liste überschreiben möchten.

Wenn die Teilliste sehr groß ist und es Ihnen nichts ausmacht, die Liste neu zu ordnen, ist sie joinmöglicherweise schneller.

Gilles 'SO - hör auf böse zu sein'
quelle
9

Sie können auch verwenden -

comm -23 file1 file2

Die Dateien müssen sortiert werden, damit der Befehl ordnungsgemäß funktioniert. Die Einträge aus Datei2 werden in der Ausgabe des Befehls aus Datei1 entfernt

Deepak
quelle
1
+1 für die Verwendung comm. Ich mag den Ansatz, den commich mit grep gemacht habe, sehr, aber comm ist gut, um Dateien in alle Richtungen zu vergleichen.
Februar
6

Wenn keine der Listen Elemente wiederholt hat, funktioniert Folgendes:

join -t$'\n' -v1 <(sort complete) <(sort partial)

Wenn die Listen wiederholte Elemente enthalten können und Sie Wiederholungen nur ignorieren möchten, können Sie das -uFlag in den Unterbefehlen sortieren verwenden, die nur eindeutige Elemente ausgeben.

Rici
quelle