Существует ли утилита diff, позволяющая исключать столбцы?

Существует ли утилита diff, позволяющая исключать столбцы?

Например, у меня есть текстовый файл, каждая строка — это длинная строка. Я хочу исключить 2 «сегмента» этой строки, скажем, столбцы 1-7 и 20-22. Поэтому нижние 2 строки ниже будут совпадением:

123456789012345678901234567890 
------------------------------
xxxxxxxAAAAAAAAAAAAxxxBBBBBBBB
yyyyyyyAAAAAAAAAAAAyyyBBBBBBBB

Я знаю, что у WinMerge есть плагин "IgnoreColumns", но я никогда не делал этого. В этом примере я бы переименовал его в IgnoreColumns_1-7, 20-22.dll, выбрал бы его в меню плагинов и выбрал "Pre-Differ". но это никогда не работало.

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

решение1

Следующее работает на Linux и Cygwin.

vimdiff <(cut -c8-19,23- file1) <(cut -c8-19,23- file2)

По какой-то причине в Cygwin Vim сообщает, что каждый файл был изменен с момента начала редактирования, и спрашивает: "[O]K, (L)oad File:". Просто набирайте Oкаждый раз.

Конечно, вы не увидите пропущенные столбцы, но это визуальное сравнение бок о бок.

решение2

Если вы все еще хотите, чтобы плагин WinMerge "IgnoreColumns" заработал... похоже, вы уже близки. Два примечания:

  1. Например, в MergePluginsподпапке WinMerge скопируйте IgnoreColumns.dll( IgnoreColumns_1-7_20-22.dllбез пробелов и используя подчеркивание вместо запятой).

  2. Полностью выйдите из WinMerge и перезапустите его после размещения этой DLL. («Перезагрузить плагины» обновит Plug-insраскрывающееся Listменю, но не обновит функциональность.)

Примечание: я рекомендую «поддерживаемую, но неофициальную» версию WinMerge – 2.13.20.12 – которая включает в себя 3-стороннее сравнение. Перейти кНеофициальные сборки WinMerge, а внизу вы увидите «Версия с поддержкой 3-стороннего дифференциала».

решение3

Как и в ответе Diogo_Rocha, вы можете заранее изменить файл, чтобы удалить столбцы, которые вы не хотите тестировать, а затем запустить diff. Но только с помощью командной строки.

Так что в вашем примере, вы могли бы удалить «столбцы» 1-7 и 20-22.

sed 's/.\{7\}\(.\{12\}\).\{3\}\(.*\)/\1\2/' test.txt > test2.txt
diff -u test2.txt whatnot.txt

Редактировать:Явное воровство лучшего ответа Гариджона.

diff -u <(cut -c8-19,23- test1.txt) <(cut -c8-19,23- test2.txt) | less

решение4

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

Связанный контент