Obtenga el número correcto de líneas en la salida diff

8

Quiero obtener el número correcto de líneas en la salida de diff (específicamente con -yy --suppress-common-linesopciones). Utilizando un sencillo wc -lhace no trabajo, porque si ambos archivos se cierra sin salto de línea y de su última línea es diferente wc -lno contará la última línea.

¿Existe una solución simple y eficiente para evitar esto?

Por ejemplo, si tiene archivos "a":

a
b
c
d   #no newline here

Y B":

a
b
c
D    #no newline here

El resultado es:

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

Lo cual obviamente es incorrecto ya diff que genera una línea.

Bakuriu
fuente

Respuestas:

13

No hay nueva línea, por lo que wc -les correcta. En cambio, desea contar el número de inicio de líneas. Una forma de hacerlo:

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

No es incorrecto Una línea tiene que ser terminada por un carácter LF, de lo contrario, no es una línea (y de todos modos wc -lestá documentado para contar caracteres de nueva línea, no líneas).

Podría canalizar la salida en algo que agregue el carácter LF faltante. GNU paste lo hace:

$ 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

Es posible que no funcione con otras implementaciones de pegar, pero dado que está utilizando opciones específicas de GNU para diff, probablemente podamos asumir con seguridad que también tiene GNU paste. POSIX no especifica el comportamiento de las utilidades de texto para líneas no terminadas.

Stéphane Chazelas
fuente
0

Como se indica en las páginas de manual e información, parece que la opción -l( --lines) wcimprime el número de caracteres de nueva línea. Entonces, si una línea no termina con un carácter de nueva línea, no incrementa el conteo.

Francesco Turco
fuente