Auflisten von Zeilen aus nur einer Datei in DIFF


34

Ich möchte, dass (GNU) DIFF nur Zeilen druckt, die sich in einer Datei unterscheiden. So gegeben

    ==> diffa.txt <==
    line1
    line2 - in a only
    line3
    line4 changed
    line5

    ==> diffb.txt <==
    line1
    line3
    line4 changed in b
    line5
    line6 in b only

Ich würde gerne diff --someoption diffa.txt diffb.txtproduzieren

    line2 - in a only

    line4 changed

Folgendes scheint hilfreich zu sein, ist aber ein bisschen kryptisch:

   --GTYPE-group-format=GFMT
          Similar, but format GTYPE input groups with GFMT.

   --line-format=LFMT
          Similar, but format all input lines with LFMT.

   --LTYPE-line-format=LFMT
          Similar, but format LTYPE input lines with LFMT.

   LTYPE is `old', `new', or `unchanged'.
          GTYPE is LTYPE or `changed'.

          GFMT may contain:

   %<     lines from FILE1

   %>     lines from FILE2

Die Manpage ist definitiv etwas knapp bei diesen Flags! Gute Frage.
Quickshiftin

1
Ich möchte darauf hinweisen, dass 'info diff' vollständige Beispiele gibt, es gibt eine Fülle von Informationen in info.
Baroudi Safwen

Antworten:


42

Ich diffbin mir nicht sicher, ob ich es alleine schaffen kann, aber Sie können immer die Leistung anderer GNU-Dienstprogramme nutzen, um Ihnen zu helfen.

diff -u diffa.txt diffb.txt | grep '^-[^-]' | sed 's/^-//'

Es macht den Unterschied, wählt dann nur die Zeilen aus, die mit '-' beginnen - diese werden geändert und haben Werte aus der diffa.txt-Datei, dann sedentfernen Sie einfach diese '-' Zeichen.

Bearbeiten: Nach ein paar Experimenten mit diffsieht es so aus, als würde der folgende Befehl das produzieren, was Sie wollen:

diff --changed-group-format='%<' --unchanged-group-format='' diffa.txt diffb.txt

Für eine einmalige Pipe ist die Methode in Ordnung. Ich würde lieber "perl -ne" drucken, wenn s / ^ - // ", aber das ist Geschmack. Ich glaube, ich sehe, was --changed-group-format='%<'ich jetzt tue ...
justintime

Vielen Dank. : DI brauchte so etwas, um alle meine Pakete zwischen zwei Computern aufzulisten, und ich habe sdiff verwendet, aber das sieht ein bisschen besser aus.
Rob

12

Eine einfachere Methode ist die Verwendung des commLinux-Dienstprogramms (für die Eingabe wird eine sortierte Datei benötigt). Es schreibt in die Standardausgabe:

  • Zeilen, die für diffa.txt eindeutig sind

  • Zeilen, die für diffb.txt eindeutig sind

  • Linien, die häufig sind

und Sie können jeden von ihnen durch Parameter 1,2 oder 3 entsprechend unterdrücken. In deinem Fall sieht es also so aus:

comm -23 diffa.txt diffb.txt

Es unterdrückt Zeilen, die für diffb.txt eindeutig sind, und druckt Zeilen aus, die nur für diffa.txt eindeutig sind

Quelle von: https://www.tutorialspoint.com/unix_commands/comm.htm


Ich fand das viel einfacher als diffdas, was ich erwartet habe. Und ich glaube, es ist sowohl auf BSD (dh Mac OS X) als auch auf Ubuntu vorinstalliert, also keine Paketmanager-Albträume.
Sridhar Sarnobat

3

Ich möchte erwähnen, commdass sortierte Eingabedateien und damit andere Ergebnisse als erwartet diff.

diff --changed-group-format='%<' --unchanged-group-format='' diffa.txt diffb.txt

ist universell. Ein großes Lob an @vava

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.