Как связать номер строки с файлом в файл результатов выходного файла diff?

Мой сценарий таков:

Сначала создайте бок о бок diff двух файлов, используя:

 diff -y --supress-common-lines file1.txt file2.txt > DiffResult.txt 

Выход DiffResult.txt :

  file1.txt file2.txt This is line A | This is line B This is line C | This is line D 

Теперь скажем, что линия

 This is line A 

а также

 This is line B 

находятся в строке 5 file1.txt и file2.txt соответственно. Тогда я должен был бы связать соответствующий номер строки с ним следующим образом:

Требуемый вывод DiffResult.txt :

  file1.txt file2.txt 5 This is line A | 5 This is line B 7 This is line C | 7 This is line D 

Причина, по которой я собираюсь использовать этот подход, состоит в том, что если я создаю номера строк перед diff , то даже при небольшом изменении пробела diff будет показывать разницу из-за номеров строк, связанных с линиями.

Кто-нибудь с яркими идеями? Я думаю, что это самый сложный вопрос, который когда-либо задавался в StackExchange, я считаю: D

One Solution collect form web for “Как связать номер строки с файлом в файл результатов выходного файла diff?”

Проблема может быть решена путем фильтрации вывода diff . Этот пример работает для меня (хотя размещение и размер желоба между левыми / правыми сторонами выходного сигнала diff, скорее всего, будет деталью, которая отличается от реализаций):

 #!/bin/sh # $Id: diff-two-column,v 1.2 2016/09/26 20:38:32 tom Exp $ # see http://unix.stackexchange.com/questions/312025/how-to-associate-line-number-from-a-file-to-the-side-by-side-diff-output-result usage() { cat >&2 <<EOF usage: $0 file1 file2 EOF exit 1 } [ $# = 2 ] || usage [ -f "$1" ] || usage [ -f "$2" ] || usage width=${COLUMNS:-80} check=$(stty size|cut -d' ' -f2) [ -n "$check" ] && width=$check diff -W $width -y "$1" "$2" | \ expand | \ awk -v width=$width ' BEGIN { L=0; R=0; gutter = width / 2; half = gutter - 2; } { textL = substr($0, 1, half - 1); sub("[ ]+$", "", textL); # trim trailing blanks # The script relies on correctly extracting textM, the gutter: # if lines differ, textM is " ! " # if line inserted, textM is " > " # if line deleted, textM is " < " # if lines unchanged, textM is " " textM = substr($0, gutter - 2, 3); textR = ( length($0) > gutter ) ? substr($0, gutter+1, half) : ""; if ( textM != " > " ) { L++; } if ( textM != " < " ) { R++; } if ( textL != textR ) { # printf "SHOW %s\n", $0; # printf "gap \"%s\"\n", textM; # printf "<<< \"%s\"\n", textL; # printf ">>> \"%s\"\n", textR; if ( textL == "" ) { printf "%5s %-*s %-3s %5d %s\n", " ", half, textL, textM, R, textR; } else if ( textR == "" ) { printf "%5d %-*s %-3s %5s %s\n", L, half, textL, textM, " ", textR; } else { printf "%5d %-*s %-3s %5d %s\n", L, half, textL, textM, R, textR; } } else { # printf "SKIP %s\n", $0; } } ' 

Вы не можете добавлять номера строк перед diff , потому что если есть вставки или удаления, номера строк, начинающиеся с этой точки, не будут совпадать, что делает различия не полезными. Мой скрипт вычисляет номера строк для левой / правой сторон разницы в awk-скрипте:

  • Вначале он решает, насколько широко распространен diff, основанный на ширине терминала.
  • Существует (в тестировании GNU diff 3.2, который я тестировал), водосточный желоб (неиспользуемое пространство) в середине бок о бок. Начиная с терминала с 80 колонками, я определил способ вычисления положения желоба.
  • После инициализации сценарий извлекает из каждой строки (в awk , это $0 ) textL слева ( textL ) и right ( textR ) и проверяет, являются ли они пустыми (что произойдет, если есть вставка / удаление).
  • Если левая / правая линии разные, сценарий восстанавливает выходной сигнал diff , но добавляет номера строк.

Учитывая это слева

 1 2 3 4 This is line A 6 This is line C 123456789.123456789.123456789.123456789.123456789. yyy 

и это справа

 1 2 3 4 This is line B 6 This is line D abcdefghi.abcdefghi.abcdefghi.abcdefghi.abcdefghi. xxx 

(10 строк слева, 9 справа), этот скрипт производит

  5 This is line A | 5 This is line B 7 This is line C | 7 This is line D 8 123456789.123456789.123456789.1234567 | 8 abcdefghi.abcdefghi.abcdefghi.abcdefg | 9 xxx 10 yyy < 
  • diff, где строки в основном одни и те же, но не в порядке?
  • Тихий результат с двумя идентичными файлами в diff: как их показать?
  • Ошибка с if : Слишком много аргументов
  • Игнорировать изменяемый размер «df -h» при использовании diff
  • Храните патч в синхронизации с изменяющимся исходным кодом
  • Сравнение двух файлов и запись несогласованных строк вместе с несогласованными столбцами. Указание несогласованных столбцов - это моя основная проблема
  • Сравнение двух файлов по горизонтали и по вертикали
  • Сравнение двух отдельных каталогов для каталогов и файлов внутри
  • Diff-каталоги с использованием времени модификации (mtime) и размера вместо содержимого
  • Как сделать N-образный diff?
  • Запуск множественного разграничения между локальными и удаленными файлами
  • Linux и Unix - лучшая ОС в мире.