Подтвердить что ты не робот

Как "разбить" несколько файлов на один базовый файл?

У меня есть файл конфигурации, который я считаю своей "базовой" конфигурацией. Я хотел бы сравнить до 10 других файлов конфигурации с этим единственным базовым файлом. Я ищу отчет, где каждый файл сравнивается с базовым файлом.

Я смотрю на diff и sdiff, но они не предлагают полностью то, что я ищу.

Я подумал о том, чтобы сравнить базу для каждого файла в отдельности, но моей проблемой стало объединение этих данных в отчет. В идеале, если одна и та же строка отсутствует во всех 10 конфигурационных файлах (по сравнению с базовой конфигурацией), я бы хотел, чтобы об этом сообщалось в простой визуализации.

Обратите внимание, что в некоторых файлах конфигурации отсутствуют некоторые строки (если сравнивать индивидуально с базой). Я хотел бы иметь возможность поместить их в одну строку (как указано выше).

Обратите внимание, что скриншот выше - просто макет, а не реальное приложение.

Я смотрел на использование некоторых элементов управления Delphi для этого и писал свои собственные (у меня Delphi 2007), но если есть программа, которая уже делает это, я бы предпочел это.

Элементы управления Delphi, на которые я смотрел, это TDiff и компоненты TrmDiff *, включенные в rmcontrols.

4b9b3361

Ответ 1

Для людей, которым все еще интересно, как это сделать, diffuse является самым близким ответом, он делает N-образное слияние посредством отображение всех файлов и объединение трех сторон между соседями.

Ответ 2

Ни один из существующих инструментов diff/merge не сделает то, что вы хотите. На основе вашего скриншота вы ищете алгоритм, который выполняет выравнивание по нескольким файлам и дает соответствующие веса на основе сходства строк.

Первая проблема - взвешивание выравнивания на основе сходства строк. Самые популярные алгоритмы выравнивания, в том числе используемые GNU diff, TDiff и TrmDiff, выполняют выравнивание на основе хешей строк и просто проверяют соответствие строк точно или нет. Вы можете предварительно обработать строки, чтобы удалить пробелы или изменить все на нижний регистр, но это. Добавьте, удалите или измените букву и объекты выравнивания по всей линии. Любое выравнивание различных линий в этой точке является чисто случайным.

Beyond Compare учитывает сходство линий, но оно действительно работает только для двухсторонних сравнений. Сравните это! также имеет своего рода алгоритм подобия, но также ограничивается двухсторонним сравнением. Это может значительно замедлить сравнение, и я не знаю о каком-либо другом компоненте или программе, коммерческом или открытом источнике, который даже пытается.

Другая проблема заключается в том, что вы также хотите сравнить несколько файлов. Это означает, что либо запустить двухсторонний алгоритм дифферирования кучу раз и сшить результаты вместе, либо найти алгоритм, который выполняет несколько выравниваний одновременно.

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

Существуют исследовательские документы, которые охватывают одновременное выравнивание нескольких последовательностей, но они обычно ориентированы на сопоставления ДНК, и вам обязательно нужно будет их самостоятельно подписать. Википедия охватывает множество основ, тогда вам, вероятно, придется переключиться на Google Scholar.

Ответ 3

Попробуйте программное обеспечение Scooter Beyond Compare. Он поддерживает трехстороннее слияние и написан в Delphi/Kylix для многоплатформенной поддержки. Я использовал его довольно широко (даже через VPN), и он хорошо работал.

Ответ 4

для f в файле file2 file3 file4 file5; do echo "$ f\n\n" → outF; diff $f baseFile → outF; echo "\n\n" → outF; сделано

Ответ 5

Diff3 должен помочь. Если вы работаете в Windows, вы можете использовать его из Cygwin или из diffutils.

Ответ 6

Я сделал свой собственный инструмент diff DirDiff, потому что мне не нужны части, которые два раза совпадают на экране, и разные части выше eachother для легкого сравнения. Вы можете использовать его в режиме каталога в каталоге с равным количеством копий базового файла. Он не отображает экспорт diff, но я перечисляет его как запрос функции.

Ответ 7

Возможно, вы захотите взглянуть на некоторые компоненты Merge, поскольку то, что вы описываете, - это то, что делают инструменты Merge между общей базой, файлом управления версиями и локальным файлом. Кроме того, что вы хотите больше, чем 2 файла (+ база)...
Только мои $0.02

Ответ 8

SourceGear Diffmerge является приятным (и бесплатным) для файлов с файлами Windows.

Ответ 9

Я знаю, что это старый поток, но vimdiff делает (почти) именно то, что вы ищете, с дополнительным преимуществом, позволяющим редактировать файлы прямо с точки зрения diff.

Ответ 10

Но ни одно из решений не содержит более трех файлов. То, что я делал, было более беспорядочным, но с той же целью (сравнивая содержимое нескольких конфигурационных файлов, без ограничений, кроме памяти и переменных BASH)

В то время как цикл считывает файл в массив:

loadsauce () {
index=0
while read SRCCNT[$index]
 do let index=index+1
 done < $SRC
}

Опять для целевого файла

loadtarget () {
index=0
while read TRGCNT[$index]
 do let index=index+1
 done < $TRG
}

сравнение строк

brutediff () {
# Brute force string compare, probably duplicates diff
# This is very ugly but it will compare every line in SRC against every line in TRG
# Grep might to better, version included for completeness
for selement in $(seq 0 $((${#SRCCNT[@]} - 1)))
 do for telement in $(seq 0 $((${#TRGCNT[@]} - 1)))
  do [[ "$selement" == "$telement" ]] && echo "${selement} is in ${SRC} and ${TRG}" >> $OUTMATCH
  done
 done
}

и, наконец, цикл, чтобы сделать это против списка файлов

for sauces in $(cat $SRCLIST)
 do echo "Checking ${sauces}..."
  loadsauce
  loadtarget
  brutediff
  echo -n "Done, "
 done

Он по-прежнему непроверен/ошибочен и неполный (например, сортировка дубликатов или компиляция списка для каждой строки с общими файлами), но это определенно движение в направлении, о котором спрашивал OP. Я действительно думаю, что Perl будет лучше для этого.