Как связать номер строки с файлом в файл результатов выходного файла 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

  • Diff несколько файлов, true, если все не равны
  • Сравнение файлов и их свойств
  • как использовать команду Diff, игнорируя текст в строке и получать непревзойденные данные на основе условия
  • Определить дубликаты блоков текста в файле
  • Выделите различия между двумя файлами, похожими на то, что Watch -d производит
  • Сравнение двух каталогов на разных серверах
  • Как создать diff для серии файлов?
  • diff два больших файла CSV (каждый 90 ГБ) и вывод на другой csv
  • 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 < 
    Linux и Unix - лучшая ОС в мире.