![是否存在允许您排除列的差异实用程序?](https://linux22.com/image/1284709/%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%E5%85%81%E8%AE%B8%E6%82%A8%E6%8E%92%E9%99%A4%E5%88%97%E7%9A%84%E5%B7%AE%E5%BC%82%E5%AE%9E%E7%94%A8%E7%A8%8B%E5%BA%8F%EF%BC%9F.png)
例如,我有一个文本文件,每行都是一个长字符串。我想排除此字符串的 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”插件正常工作……看起来您已经很接近成功了。请注意以下两点:
例如,在 WinMerge 的
MergePlugins
子文件夹中,复制IgnoreColumns.dll
到IgnoreColumns_1-7_20-22.dll
(没有空格,使用下划线代替逗号)。放置该 DLL 后,完全退出 WinMerge,然后重新运行它。(“重新加载插件”将更新
Plug-ins
/List
下拉菜单,但不会更新功能。)
附注:我推荐使用“受支持但非官方”的 WinMerge 版本 - 2.13.20.12 - 其中包含三向比较。转到非官方 WinMerge 版本,在底部你会看到“3-way diff 支持的版本”。
答案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”键。选择这些列后,您可以复制、剪切或删除所需的每个列。