Obter número correto de linhas na saída diff

8

Eu quero obter o número correto de linhas na saída do diff (especificamente com -ye --suppress-common-linesopções). Usando um simples wc -lfaz não trabalho, porque se ambos os arquivos terminar sem uma nova linha e sua última linha é diferente wc -lnão vai contar a última linha.

Existe uma solução simples e eficiente para evitar isso?

Por exemplo, se você tiver os arquivos "a":

a
b
c
d   #no newline here

E B":

a
b
c
D    #no newline here

A saída é:

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

O que obviamente é incorrecta, uma vez diff faz a saída de uma linha.

Bakuriu
fonte

Respostas:

13

Não há nova linha, então wc -lestá correto. Em vez disso, você deseja contar o número de linhas iniciadas. Uma maneira de fazer isso:

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

Não está incorreto. Uma linha deve ser terminada por um caractere LF, caso contrário, não é uma linha (e de qualquer maneira wc -lé documentada para contar caracteres de nova linha, não linhas).

Você pode canalizar a saída para algo que adicione de volta o caractere LF ausente. A pasta GNU faz isso:

$ 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

Pode não funcionar com outras implementações de colar, mas como você está usando opções específicas do GNU diff, provavelmente podemos assumir com segurança que você também tem o GNU paste. O comportamento dos utilitários de texto para linhas não terminadas não é especificado pelo POSIX.

Stéphane Chazelas
fonte
0

Conforme declarado nas páginas de manual e informações, parece que a opção -l( --lines) para wcimprime o número de caracteres de novas linhas. Portanto, se uma linha não terminar com um caractere de nova linha, não aumentará a contagem.

Francesco Turco
fonte