Liste des lignes d'un seul fichier en DIFF

34

Je voudrais que (GNU) DIFF imprime uniquement les lignes qui sont différentes dans un fichier. Donc donné

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

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

je voudrais diff --someoption diffa.txt diffb.txtproduire

    line2 - in a only

    line4 changed

Ce qui suit devrait être utile, mais c'est un peu cryptique:

   --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
la source
La page de manuel est définitivement un peu laconique sur ces drapeaux! Bonne question.
quickshiftin
1
Je voudrais souligner que «info diff» donnera des exemples complets, il y a une mine d'informations dans info.
Baroudi Safwen

Réponses:

42

Je ne suis pas sûr que diffseul puisse le faire, mais vous pouvez toujours utiliser la puissance d'autres utilitaires GNU pour vous aider.

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

Il fait la différence, puis ne sélectionne que les lignes qui commencent par «-» - celles-ci sont modifiées et ont des valeurs du fichier diffa.txt, puis sedsupprimez simplement les signes «-».

Modifier: après quelques expériences avec diff, la commande ci-dessous donne ce que vous voulez:

diff --changed-group-format='%<' --unchanged-group-format='' diffa.txt diffb.txt
vava
la source
Pour un seul, la méthode du tuyau est très bien. Je préférerais imprimer `perl -ne" si s / ^ - // "` mais c'est le goût. Je pense que je vois ce que je --changed-group-format='%<'fais maintenant ...
justintime
Merci. : DI avait besoin de quelque chose comme ça pour lister tous mes paquets entre deux ordinateurs et j'ai utilisé sdiff mais ça a l'air un peu mieux.
Rob
12

La méthode la plus simple consiste à utiliser l' commutilitaire linux (il a besoin d'un fichier trié pour l'entrée). Il écrit sur la sortie standard:

  • lignes uniques pour diffa.txt

  • lignes uniques pour diffb.txt

  • lignes communes

et vous pouvez supprimer chacun d'eux par le paramètre 1,2 ou 3 en conséquence. Donc, dans votre cas, cela ressemblera à ceci:

comm -23 diffa.txt diffb.txt

Il supprime les lignes qui sont uniques pour diffb.txt, les lignes qui sont communes et imprime les lignes qui sont uniques uniquement pour diffa.txt

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

hukko
la source
J'ai trouvé cela beaucoup plus facile que celui diffqui ne fait pas ce que j'attends. Et je crois qu'il est préinstallé à la fois sur BSD (c'est-à-dire Mac OS X) ainsi que sur Ubuntu donc pas de cauchemars de gestionnaire de paquets.
Sridhar Sarnobat
3

Je voudrais mentionner que comms'attend à des fichiers d'entrée triés et rapporte donc des résultats différents de diff.

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

est universel. Bravo à @vava

PSchwede
la source