Obtenez le nombre correct de lignes dans la sortie diff

8

Je veux obtenir le nombre correct de lignes dans la sortie de diff (en particulier avec -yet --suppress-common-linesoptions). L'utilisation d'un simple wc -lne fonctionne pas , car si les deux fichiers se terminent sans nouvelle ligne et que leur dernière ligne est différente wc -l, la dernière ligne ne sera pas comptée.

Existe-t-il une solution simple et efficace pour éviter cela?

Par exemple, si vous avez des fichiers "a":

a
b
c
d   #no newline here

Et B":

a
b
c
D    #no newline here

La sortie est:

$ diff -y --suppress-common-lines a b | wc -l
0

Ce qui est évidemment incorrect car diff il produit une ligne.

Bakuriu
la source

Réponses:

13

Il n'y a pas de nouvelle ligne, donc wc -lc'est correct. Au lieu de cela, vous souhaitez compter le nombre de début de lignes. Une façon de le faire:

$ diff -y --suppress-common-lines a b | grep '^' | wc -l
1
ire_and_curses
la source
3

Ce n'est pas incorrect. Une ligne doit être terminée par un caractère LF, sinon ce n'est pas une ligne (et de toute façon il wc -lest documenté pour compter les caractères de nouvelle ligne, pas les lignes).

Vous pouvez diriger la sortie vers quelque chose qui ajoute le caractère LF manquant. La pâte GNU le fait:

$ diff -y --suppress-common-lines <(printf a) <(printf b) | wc -l
0
$ diff -y --suppress-common-lines <(printf a) <(printf b) | paste | wc -l
1

Cela pourrait ne pas fonctionner avec d'autres implémentations de paste, mais puisque vous utilisez des options spécifiques à GNU diff, nous pouvons probablement supposer en toute sécurité que vous avez également GNU paste. Le comportement des utilitaires de texte pour les lignes non terminées n'est pas spécifié par POSIX.

Stéphane Chazelas
la source
0

Comme indiqué dans les pages man et info, il semble que l' option -l( --lines) pour wcimprimer le nombre de caractères de nouvelle ligne. Donc, si une ligne ne se termine pas par un caractère de nouvelle ligne, elle n'incrémente pas le nombre.

Francesco Turco
la source