列を除外できる 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」プラグインをまだ動作させたい場合... 近づきそうです。 2 つの注意事項:

  1. たとえば、WinMerge のMergePluginsサブフォルダーIgnoreColumns.dllにコピーしますIgnoreColumns_1-7_20-22.dll(スペースなし、カンマの代わりに下線を使用)。

  2. その DLL を配置した後、WinMerge を完全に終了し、再度実行します。(「プラグインの再読み込み」はPlug-ins/Listプルダウン メニューを更新しますが、機能は更新しません。)

補足: 3者間比較機能を含む「サポート対象だが非公式」バージョンのWinMerge 2.13.20.12をお勧めします。非公式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

編集:garyjohn のより良い回答を露骨に盗用しています。

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

答え4

あなたの疑問が理解できれば、テキストファイルから特定の列を除外または選択しようとしているということです。それが本当なら、テキストパッドアプリケーションをインストールしてテキスト ファイルを開き、テキストから特定の列を選択するときに「Alt」キーを押します。選択した列ごとに、必要な列をコピー、切り取り、または削除できます。

関連情報