Получить правильное количество строк в выводе diff


8

Я хочу , чтобы получить правильное количество строк в выводе дифф ( в частности , с -yи --suppress-common-linesопции). Использование простого wc -lделает не работать, потому что , если оба файл заканчивается без перевода строки и их последняя линия отличается wc -lне будет считать последнюю строку.

Есть ли простое и эффективное решение, чтобы избежать этого?

Например, если у вас есть файлы «а»:

a
b
c
d   #no newline here

И "б":

a
b
c
D    #no newline here

Выход:

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

Что, очевидно , неверно , так как diff делает вывод строку.

Ответы:


13

Новой строки нет, так что wc -lэто правильно. Вместо этого вы хотите посчитать количество начальных строк. Один из способов сделать это:

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

3

Это не неправильно. Строка должна заканчиваться символом LF, иначе это не строка (и в любом случае wc -lдокументируется для подсчета символов новой строки, а не строк).

Вы можете передать вывод во что-то, что добавляет недостающий символ LF. GNU paste делает это:

$ 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

Возможно, он не будет работать с другими реализациями paste, но, поскольку вы используете специальные параметры для GNU diff, мы можем с уверенностью предположить, что у вас также есть GNU paste. POSIX не определяет поведение текстовых утилит для не завершенных строк.


0

Как указано на страницах man и info, кажется, что опция -l( --lines) позволяет wcпечатать количество символов новой строки. Поэтому, если строка не заканчивается символом новой строки, она не увеличивает счетчик.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.