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.