Não há nova linha, então wc -l está correto. Em vez disso, você deseja contar o número de linhas iniciais. Uma maneira de fazer isso:
$ diff -y --suppress-common-lines a b | grep '^' | wc -l
1
Eu quero obter o número correto de linhas na saída do diff (especificamente com as opções -y e --suppress-common-lines ). Usar um wc -l simples não não funciona, porque se os dois arquivos terminarem sem uma nova linha e a última linha for diferente wc -l não contará a última linha.
Existe uma solução simples e eficiente para evitar isso?
Por exemplo, se você tiver 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 incorreto, pois diff faz produzir uma linha.
Não está incorreto. Uma linha deve ser terminada por um caractere LF, caso contrário, não é uma linha (e, de qualquer forma, wc -l é documentado para contar caracteres de nova linha, não linhas).
Você pode canalizar a saída para algo que adiciona de volta o caractere LF ausente. A pasta do 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 para diff , provavelmente podemos assumir com segurança que você tem o GNU paste também. O comportamento de utilitários de texto para linhas não terminadas não é especificado por POSIX.
Conforme indicado nas páginas man e info, parece que a opção -l ( --lines ) para wc imprime o número de caracteres newline. Portanto, se uma linha não terminar com um caractere de nova linha, isso não aumentará a contagem.