比较两个文件并删除重复项

比较两个文件并删除重复项

比较两个文件并删除在两个文件中找到的重复项的最简单方法是什么。我知道您可以在 Linux 机器上使用某些命令轻松完成此操作,但是如何在 Windows 计算机上实现此操作?我以为有一种方法可以在 Notepad++ 上执行此操作,但我似乎找不到。

这里的其他答案不支持 Windows 上的用户或不起作用。

答案1

我知道您可以使用某些命令在 Linux 上轻松地完成此操作,但是如何在 Windows 计算机上实现此操作呢?

操作系统

如果您愿意安装其他第三方软件,操作系统(GNUWin32)项目提供了许多这些实用程序(命令)的 Windows 端口。

实用程序本身提供每个软件包中都捆绑有单个实用程序或多个实用程序。每个软件包都可以单独安装1,但某些软件包除外,因为其中包含的实用程序依赖于其他实用程序。

您最有可能想要安装的基本软件包是CoreUtils 包但也有其他可用的软件包(取决于您希望使用什么实用程序)。

不管怎样,我已经使用 GNUWin32 实用程序包含了一些简单的示例批处理文件,它们可能会对您在本答案的另一部分有所帮助。

GNUWin32 替代品

除了 Windows 10 中的 Windows Subsystem for Linux (WSL) 之外,在 Windows 上还有其他可能的选项可以使用这些类型的实用程序,例如适用于 Windows 的 Git赛格威

这些版本通常具有比 GNUWin32 版本更为新的优点,但可能在安装和使用方面存在不足。


1 GNUWin32 项目提供了一个名为获得GnuWin32,它可以一次性下载并安装所有可用的 GNUWin32 包(如果这是您的首选)。

记事本++

我个人不知道有任何 Notepad++ 插件或功能可以完全支持您要完成的任务。但是,Notepad++ 可以直接通过 Notepad++ 运行批处理脚本、命令和可执行文件跑步...菜单(F5)或 NppExec 插件,因此可以(在某种程度上)与 GNUWin32 实用程序配合使用。

话虽如此,我不确定是否有一个好的机制可以将单独打开的文件作为一个组提供给上面列出的任何文件。一个部分解决方法是将两个文件合并为一个,对它们进行排序,保存文件,然后针对该保存的文件运行本答案后面给出的“单个文件输出”示例批处理文件的变体。

Notepad++ 确实支持通过以下方式与编辑器进行更多低级交互:Notepad++ 插件的 Python 脚本(基于 Python 2.7 的独立版本)。遗憾的是,我对该插件的体验有限,因此我不确定它能否帮助您实现所需的功能(如果有的话)。

如果你想亲自尝试 Python Script for Notepad++ 插件,你可以将其安装在插件 → 插件管理...Notepad++中的界面。


GNUWin32 批处理示例

下面给出的批处理 ( .bat) 文件示例利用了 GNUWin32 实用程序,旨在展示一些基本方法(希望能够)帮助您实现目标。但它们仅供参考。它们几乎肯定可以得到改进,甚至可以完全忽略,转而采用其他方法。


这些批处理文件假定 GNUWin32核心工具软件包已安装(用于sortuniqcomm实用程序)。使用的示例comm还需要sed(单独的包)。


为了完整性,以下(最小)文本文件被用作下面概述的示例脚本的测试输入:

例如 dup1.txt

abc
def
123
ghi

独特线路: 123

--

例如 dup2.txt

ghi
abc
jkl
def

独特线路: jkl


示例批处理 - 单个文件输出

与 GNUWin32 CoreUtils 包结合使用,您可以创建一个 Windows 批处理文件,该文件支持将两个文本文件拖放到其中,然后将不重复的行显示为在 Notepad++ 等中打开的第三个单个文件:

例如 nodupes.bat

@ECHO Off

@REM Two input files (paths)
gnu-sort %1 %2 | uniq -u > uniq_text.txt

@REM Check our command output.
:: PAUSE

START notepad++.exe uniq_text.txt

请注意,在上面的例子中,gnu-sort是 GNUWin32sort实用程序,已重命名以避免在 Windows 中发生冲突(请参阅Windows 冲突部分)。


虽然为了方便起见,此批处理文件可以以“拖放”模式使用,但您也可以直接在命令行中传递相关文件名,例如nodupes.bat dup1.txt dup2.txt。本节中的其他批处理示例也是如此。


批处理示例 - 单个文件输出 (Notepad++)

为了在 Notepad++ 中更直接地实现类似的功能,您可以创建一个类似于上面已经描述的新批处理文件,但只需输入一个:

例如 nodupes-npp.bat

@ECHO Off

@REM One input file (path)
gnu-sort %1 | uniq -u > C:\path\to\uniq_text.txt

START notepad++ C:\path\to\uniq_text.txt

然后,您需要将此.bat文件保存在静态位置,以供 Notepad++ 引用。然后,在 Notepad++ 中,例如在跑步...菜单(F5),您可以为当前打开的任何(单个)文件调用此批处理文件:

cmd /c C:\path\to\nodupes-npp.bat "$(FULL_CURRENT_PATH)"

然而,这种方法存在一些注意事项:

1)当前打开的文件需要是您想要比较数据的两个文件的组合版本。

2)在使用此工具之前,必须保存要应用此功能的文件.bat/跑步...方法。这是因为:

  • "$(FULL_CURRENT_PATH)"在文件保存之前,在 Notepad++ 中不可用。

  • 如果对文件进行了更改,则任何更新都需要应用于正在访问的实际文件(即磁盘上的版本,而不是 Notepad++ 中当前打开的版本)。

批处理示例 - 多文件输出

如果你想要按原始文件(相对)划分唯一的行,comm你可以使用和的组合sed

例如 nodupes-separated.bat

@ECHO Off

@REM Use sed to divide our comm -3 output into two files,
@REM using a simple sed script (filter.sed).

gnu-sort %1 > sorted_duplicates_1.txt
gnu-sort %2 > sorted_duplicates_2.txt

comm -3 sorted_duplicates_1.txt sorted_duplicates_2.txt | sed -f filter.sed

@REM Check our command output.
:: PAUSE

@REM Clean up our temporary files.
DEL sorted_duplicates_1.txt
DEL sorted_duplicates_2.txt

@REM These file names are defined in ex. filter.sed
START notepad++ uniq_text_1.txt
START notepad++ uniq_text_2.txt

例如 filter.sed

/^\t/ {
    s///
    w uniq_text_2.txt
    d
}
/^[^\t]/ {
    w uniq_text_1.txt
    d
}

请注意,虽然comm是 CoreUtils 包的一部分,sed 是随 GNUWin32 单独下载的。请记住,上述批处理文件不会更改您的原始文件,它将创建两个新文件(因此重命名它们由您决定)。此外,正如所写,ex.filter.sed需要与您的批处理文件位于同一目录中(例如nodupes-separated.bat)。


Windows 冲突(GNUWin32)

GNUWin32 包含一些与 Windows 实用程序或命令同名的实用程序(例如sort)。这可能会带来(轻微的)问题,因为每个实用程序的运行方式可能不同。我个人知道 GNUWin32 CoreUtils 包中的冲突是:

  • 日期
  • 目录
  • 回声
  • 寻找
  • 主机名
  • 种类
  • 我是谁

请记住,单独的包中也可能存在其他冲突,例如tree


如果您想从环境路径访问 GNUWin32 版本(即不输入其完整路径),您可以重命名相应的 GNUWin32 可执行文件本身(推荐)或使用名称不同的替代批处理文件(不太理想)。替代批处理文件将仅包含例如:

例如 gnu-utility.bat

@ECHO Off
C:\path\to\GNUWin32\bin\utility.exe %*

使用 Windows 实用程序版本

您可能能够使用实用程序的 Windows 版本,但它们可能需要您重新设计处理方式。例如,sort默认情况下,Windows 一次只能接受一个输入,因此nodupes.bat上面的原始示例在使用它时可能如下所示:

例如 nodupes-win-sort.bat

@ECHO Off

@REM Helps compensate for a minor issue with cat and newlines
ECHO. > blank

@REM Using Windows sort, not GNUWin32 sort
cat %1 blank %2 | sort | uniq -u > uniq_text.txt

@REM Clean up our temporary file.
DEL blank

START notepad++.exe uniq_text.txt

注释(GNUWin32)

  • 为了使 GNUWin32 实用程序在不指定完整路径的情况下工作,您需要将它们添加到 Windows 中的环境路径中。否则,您将需要为每个可执行文件指定完整路径(请注意,这可能会导致麻烦,例如管道问题)。

  • GNUWin32 包最好放在您创建的“常规” Windows 文件夹中(即不是C:\Program FilesC:\Program Files (x86)或您的User文件夹)。

  • 您同样应该尝试将 GNUWin32 安装到没有空格的路径中(例如C:\Programs\GNUWin32)。

  • 虽然 GNUWin32 CoreUtils 包支持各种基本工具,仍有相当多的实用程序以单独的软件包或实用程序组的形式提供。此外,某些实用程序可能工作方式略有不同,或者具有更有限的选项/语法,这仅仅是因为底层操作系统(Windows)不是 Linux。

相关内容