Vergleichen Sie zwei URL-Listen und drucken Sie neu hinzugefügte URLs in eine neue Datei


8

Ich produziere zunächst zwei Dateien, die Listen von URLs enthalten - ich werde sie als oldund bezeichnen new. Ich möchte die beiden Dateien vergleichen und wenn die URL URLs newenthält, die nicht in der oldDatei enthalten sind, möchte ich, dass diese in einer extra_urlsDatei angezeigt werden.

Jetzt habe ich einige diffInformationen zur Verwendung des Befehls gelesen, aber soweit ich das beurteilen kann, wird auch die Reihenfolge der Informationen analysiert. Ich möchte nicht, dass die Reihenfolge Auswirkungen auf die Ausgabe hat. Ich möchte nur, dass die zusätzlichen URLs in newdie extra_urlsDatei gedruckt werden, unabhängig davon, in welcher Reihenfolge sie in einer der beiden anderen Dateien platziert sind.

Wie kann ich das machen?

Antworten:


14

Mit dem commBefehl können Sie zwei Dateien vergleichen und selektiv Zeilen anzeigen, die für die eine oder andere oder die gemeinsamen Zeilen eindeutig sind. Es erfordert, dass die Eingaben sortiert werden, aber Sie können sie im laufenden Betrieb sortieren, indem Sie die Prozessersetzung verwenden.

comm -13 <(sort old.txt) <(sort new.txt)

Wenn Sie eine Version verwenden bash, die keine Prozessersetzung unterstützt, kann sie mithilfe von Named Pipes emuliert werden. Ein Beispiel wird in Wikipedia gezeigt .


Prägnant, aber effektiv - genau das, was benötigt wurde, exzellenter Code für das, was ich brauchte.
23.

Hmm, aber wenn die Eingabe sortiert ist, diffwird das Gleiche tun, oder?
halb

diffzeigt alle Unterschiede. commMit dieser Option können Sie auswählen, ob die Zeilen aus Datei 1, Datei 2 oder die gemeinsamen Zeilen angezeigt werden sollen.
Barmar

Hallo Barmar, ich bin mir nicht sicher, ob du das überprüfen wirst, aber nur für den Fall, ich habe dieses Skript auf meine Synology Nas verschoben, um es von dort aus auszuführen. Seit ich mein Skript über die Synology ausgeführt habe,
erhalte

Welche Version von bashläuft es? Die Prozessersetzung wird möglicherweise nicht unterstützt.
Barmar

6

Ich würde nur verwenden grep:

grep -vFf old new > extra_urls

Erläuterung

  • -f: weist grepan, seine Suchmuster aus einer Datei zu lesen. In diesem Fall old.
  • -v : Weist grep an, die Übereinstimmung umzukehren und nur nicht übereinstimmende Zeilen zu drucken.
  • -F: Weist grep an, seine Suchmuster als Zeichenfolgen und nicht als reguläre Ausdrücke zu interpretieren. Auf diese Weise wird die .URL buchstäblich abgeglichen.

Zusammen lassen diese grepZeilen drucken new, die nicht vorhanden waren old. Die Reihenfolge der URLs in der Datei ist irrelevant.


Hallo Terdon, danke für deine Eingabe. Ich habe dies gerade getestet und es wurde eine leere "zusätzliche URL" -Datei erstellt, obwohl die "neue" Datei neue URLs enthält.
NeilH

@ bms9nmh hmm, das ist seltsam. Bitte bearbeiten Sie Ihre Frage, um ein Beispiel für Ihre Eingabedateien zu geben. Vielleicht möchten Sie auch in den Chatraum der Site kommen , wo wir dies weiter diskutieren können.
Terdon

2
Sie möchten -Ffür einfache Textmuster hinzufügen
Glenn Jackman

1

Da die Reihenfolge für Sie wichtig ist, verwenden Sie awk

awk '
    NR == FNR {old[$1]=1; next}
    !($1 in old)
' old new > extra

1
Hallo Glen, nur um zu verdeutlichen, ist die Reihenfolge nicht wichtig. Die Reihenfolge der URL ist kein Problem, nur der Unterschied zwischen den beiden Dateien, dh die zusätzlichen URLs. Ich möchte den Unterschied nicht, um die Ausgabe in irgendeiner Weise zu beeinflussen.
NeilH

@ bms9nmh: Sie könnten nur ändern > extrazu | sort > extra. oder | sort -u > extrawenn Sie möchten, dass eine neue URL nur einmal in der Ausgabe angezeigt wird, unabhängig davon, wie oft sie in der Eingabe enthalten ist. Die Eingabereihenfolge kann sich auf die Ausgabereihenfolge auswirken, es sei denn, Sie führen irgendwo auf dem Weg zusätzliche Arbeiten aus, um dies zu verhindern.
Steve Jessop

@steve, meh, commist die beste Antwort auf diese Frage, obwohl grep -Fvfes auch gut ist
Glenn Jackman

0

Ich habe eine Anwendung namens meld. Es ermöglicht das Anzeigen der zwei (oder drei) Dateien nebeneinander, zeigt die Unterschiede und ermöglicht das selektive Kopieren von einem zum anderen oder das Löschen von Zeichen.

Meld kann von einem Terminal mit installiert werden

sudo apt-get install meld 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.