Intereting Posts
домен lynx показывает ошибку 404 при запуске из localhost Не удается подключиться к беспроводной сети в Arch Linux netctl Переименовать каталог и заменить только обновленные файлы Командная строка Unix / Linux Предопределенный источник ввода для каждого окна в Gnome Как быстро остановить кучу процессов в unix? Поиск строки во всех файлах внутри войны Как отключить перемещение между рабочими областями? Настройка TimeoutStopSec в файле systemd Как сохранить файл истории cygwin bash на независимых сеансах? Утилита, полезная для работы с памятью, возвращает N первых отсортированных значений Сервер Debian с 3-мя сетевыми интерфейсами. Связь с 3-мя различными подсетями IP. Исключение каталога при застегивании файлов Запустите команду ping в списке серверов и выведите файл в файл Оболочка xmllint не показывает число из выражения count xpath? Версия для PHP с пониженным рейтингом на debian

Как связать номер строки с файлом в файл результатов выходного файла 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 . Этот пример работает для меня (хотя размещение и размер желоба между левыми / правыми сторонами выходного сигнала 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 <