Listando linhas de apenas um arquivo em DIFF

34

Gostaria que o (GNU) DIFF imprimisse apenas as linhas diferentes em um arquivo. Tão dado

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

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

eu gostaria diff --someoption diffa.txt diffb.txtde produzir

    line2 - in a only

    line4 changed

A seguir, parece que deve ser útil, mas é um pouco enigmático:

   --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
na hora certa
fonte
A página de manual é definitivamente um pouco concisa sobre essas bandeiras! Boa pergunta.
precisa
11
Gostaria de salientar que 'info diff' dará exemplos completos, há uma riqueza de informações em informações.
Baroudi Safwen

Respostas:

42

Não tem certeza diffsozinho, mas você sempre pode usar o poder de outros utilitários GNU para ajudá-lo.

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

Ele faz o diff e, em seguida, seleciona apenas as linhas que começam com '-' - essas são alteradas e têm valores do arquivo diffa.txt e, em seguida, sedapenas remova os sinais '-'.

Edit: Após algumas experiências com diff, parece que o comando abaixo produz o que você deseja:

diff --changed-group-format='%<' --unchanged-group-format='' diffa.txt diffb.txt
vava
fonte
Para um método fora do tubo, tudo bem. Eu preferiria `perl -ne" print se s / ^ - // "` mas isso é bom gosto. Eu acho que vejo o que --changed-group-format='%<'está fazendo por mim agora ....
justintime
Obrigado. : O DI precisava de algo assim para listar todos os meus pacotes entre dois computadores e eu usei o sdiff, mas isso parece um pouco melhor.
Rob
12

O método mais simples é usar o commutilitário linux (ele precisa de um arquivo classificado para entrada). Ele grava na saída padrão:

  • linhas que são exclusivas para diffa.txt

  • linhas que são exclusivas para diffb.txt

  • linhas que são comuns

e você pode suprimir cada um deles pelo parâmetro 1,2 ou 3 de acordo. Portanto, no seu caso, será assim:

comm -23 diffa.txt diffb.txt

Suprime linhas exclusivas para diffb.txt, linhas comuns e imprime linhas únicas apenas para diffa.txt

Fonte: https://www.tutorialspoint.com/unix_commands/comm.htm

hukko
fonte
Achei isso muito mais fácil do que o diffque não está fazendo o que eu espero. E eu acredito que ele esteja pré-instalado tanto no BSD (ou seja, no Mac OS X) quanto no Ubuntu, para que não haja pesadelos no gerenciador de pacotes.
Sridhar Sarnobat
3

Eu gostaria de mencionar que commespera arquivos de entrada classificados e, portanto, relata resultados diferentes diff.

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

é universal. Muitos elogios para @vava

PSchwede
fonte