Obtém o número correto de linhas na saída do diff

8

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.

    
por Bakuriu 03.11.2012 / 12:16

3 respostas

10

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
    
por 03.11.2012 / 13:00
3

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.

    
por 03.11.2012 / 13:30
0

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.

    
por 03.11.2012 / 12:54

Tags