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

  • gzip-файлы с кошкой и из трубы дают разные результаты
  • слияние, которое работает с детализацией слов вместо строки
  • Разделение двух каталогов рекурсивно на основе контрольных сумм?
  • Цветное слово-diff, как git's?
  • `diff -y file- {a, b} | less` и DOS.
  • Получение отличия от обновления пакета
  • Сравнение текстовых файлов на Emacs
  • Сделать diff Использовать полную ширину терминала в бок о бок режиме
  • 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 < 
    Interesting Posts

    Символическая ссылка становится нечитаемой после prctl (PR_SET_DUMPABLE, 0);

    Принтер Panasonic отказывается печатать

    Невозможно скомпилировать Apache: «Ошибка, библиотеки SSL / TLS отсутствовали или были недоступны»

    Хром теряет последовательности компоновки, последний символ которых использует Shift

    Что такое эквивалент samba для команды Windows «Просмотр сведений учетной записи пользователя» NET USER

    Что со всеми переименованиями: prename, rename, file-rename?

    Черный экран после установки драйвера Nvidia

    Как распечатать все строки после совпадения до конца файла?

    Ошибка OMP Bash на Ubuntu в Windows

    Отключить функцию автоскрытия нижней панели оболочки GNOME

    Используйте curl для отправки двоичного файла через POST с помощью типа multipart / form-data;

    Установка Unity на RHEL 7 / Горизонтальные рабочие пространства (Grid) на Gnome 3.14.2

    Компиляция модулей apache -enable-mods-shared vs -enable-modules

    Как отобразить управляющие символы (^ C, ^ D, ^ [, …) по-разному в оболочке

    Почему пакеты slackware воссоздают символические ссылки после установки?

    Linux и Unix - лучшая ОС в мире.