Gibt es ein Tool, das Zeilen abrufen kann, die Datei A enthält, Datei B jedoch nicht? Ich könnte z. B. mit Perl ein kleines einfaches Skript erstellen, aber wenn so etwas bereits existiert, spare ich mir von jetzt an Zeit.
Akzeptierte Antwort:
Ja. Das standardmäßige grep
Werkzeug zum Durchsuchen von Dateien nach Textzeichenfolgen kann verwendet werden, um alle Zeilen in einer Datei von einer anderen zu subtrahieren.
grep -F -x -v -f fileB fileA
Dies funktioniert, indem jede Zeile in DateiB als Muster verwendet wird (-f fileB
) und behandelt es als einfachen String zum Abgleichen (kein regulärer regulärer Ausdruck) (-F
). Sie erzwingen, dass die Übereinstimmung auf der gesamten Zeile erfolgt (-x
) und nur die Zeilen ausgeben, die nicht übereinstimmen (-v
). Daher drucken Sie die Zeilen in DateiA aus, die nicht die gleichen Daten wie eine Zeile in DateiB enthalten.
Der Nachteil dieser Lösung ist, dass die Zeilenreihenfolge nicht berücksichtigt wird und wenn Ihre Eingabe doppelte Zeilen an verschiedenen Stellen enthält, erhalten Sie möglicherweise nicht das, was Sie erwarten. Die Lösung dafür ist die Verwendung eines echten Vergleichstools wie diff
. Sie könnten dies tun, indem Sie eine Diff-Datei mit dem Kontextwert von 100 % der Zeilen in der Datei erstellen und sie dann nur auf die Zeilen parsen, die entfernt würden, wenn Datei A in Datei B konvertiert würde. (Beachten Sie auch diesen Befehl entfernt die Diff-Formatierung, nachdem sie die richtigen Zeilen erhalten hat.)
diff -U $(wc -l < fileA) fileA fileB | sed -n 's/^-//p' > fileC