Listowanie wierszy z tylko jednego pliku w DIFF

34

Chciałbym, aby (GNU) DIFF wypisał tylko linie różniące się w jednym pliku. Tak podane

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

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

chciałbym diff --someoption diffa.txt diffb.txtprodukować

    line2 - in a only

    line4 changed

Poniższe wygląda na to, że powinno być pomocne, ale jest nieco tajemnicze:

   --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
justintime
źródło
Strona podręcznika jest zdecydowanie krótka na tych flagach! Dobre pytanie.
szybka zmiana w
1
Chciałbym zaznaczyć, że „diff info” daje pełne przykłady, w informacji jest mnóstwo informacji.
Baroudi Safwen

Odpowiedzi:

42

Nie jestem pewien, czy diffsam to potrafi, ale zawsze możesz skorzystać z mocy innych narzędzi GNU, aby ci pomóc.

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

Robi różnicę, a następnie wybiera tylko linie zaczynające się od „-” - te są zmieniane i mają wartości z pliku diffa.txt, a następnie sedpo prostu usuwają te znaki „-”.

Edycja: po kilku eksperymentach z diff, wygląda na to, że poniższe polecenie generuje to, co chcesz:

diff --changed-group-format='%<' --unchanged-group-format='' diffa.txt diffb.txt
vava
źródło
Dla jednorazowej metody rury jest w porządku. Wolałbym wydrukować „perl -ne”, jeśli s / ^ - // "` ale to jest smak. Chyba widzę co --changed-group-format='%<'robisz dla mnie teraz ....
JustInTime
Dzięki. : DI potrzebował czegoś takiego, aby wyświetlić listę wszystkich moich pakietów między dwoma komputerami i użyłem sdiff, ale wygląda to nieco lepiej.
Rob
12

Prostszą metodą jest użycie commnarzędzia linux (potrzebuje pliku posortowanego do wprowadzania). Zapisuje na standardowe wyjście:

  • linie, które są unikalne dla diffa.txt

  • linie, które są unikalne dla diffb.txt

  • linie, które są wspólne

i możesz wyłączyć każdy z nich odpowiednio parametrem 1,2 lub 3. W twoim przypadku będzie to wyglądać tak:

comm -23 diffa.txt diffb.txt

Pomija linie unikalne dla diffb.txt, linie wspólne i drukuje linie unikalne tylko dla diffa.txt

Źródło: https://www.tutorialspoint.com/unix_commands/comm.htm

hukko
źródło
Uznałem to za znacznie łatwiejsze niż diffto, co nie robi tego, czego oczekuję. I wierzę, że jest preinstalowany zarówno na BSD (tj. Mac OS X), jak i na Ubuntu, więc nie ma koszmarów menedżera pakietów.
Sridhar Sarnobat
3

Chciałbym wspomnieć, że commoczekuje posortowanych plików wejściowych, a tym samym zgłasza inne wyniki niż diff.

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

jest uniwersalny. Uznanie dla @vava

PSchwede
źródło