是否有 diff 實用程式可讓您排除列?

是否有 diff 實用程式可讓您排除列?

例如,我有一個文字文件,每一行都是一個長字串。我想排除該字串的 2 個“段”,例如第 1-7 列和第 20-22 列。所以下面最下面的兩行是相符的:

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. 對於您的範例,在 WinMerge 的MergePlugins子資料夾中,複製IgnoreColumns.dllIgnoreColumns_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”鍵。選擇這些列後,您可以複製、剪下或刪除您需要的每一列。

相關內容