@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
前任。过滤器.sed
/^\t/ {
s///
w uniq_text_2.txt
d
}
/^[^\t]/ {
w uniq_text_1.txt
d
}
您也许可以使用 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
如果您愿意安装额外的第三方软件,GNUWin (GNUWin32) 项目提供了许多此类实用程序(命令)的 Windows 端口。
实用程序本身以包的形式提供,每个包中包含一个实用程序或多个实用程序。每个软件包都可以单独安装1,但某些软件包除外,其中包含的实用程序依赖于其他软件包。
您最可能想要安装的基本包是CoreUtils 包,但也有其他可用的包(取决于您可能希望使用的实用程序)。
对于它的价值,我已经包含了一些使用 GNUWin32 实用程序的简单示例批处理文件,这可能会在此答案的另一部分对您有所帮助。
GNUWin32 替代品
除了 Windows 10 中的 Windows Linux 子系统 (WSL),还有其他可能的选项可以在 Windows 上使用这些类型的实用程序,例如Git for Windows和Cygwin。
这些版本通常具有比 GNUWin32 版本更新的优势,但可以说可能缺乏安装和使用的便利性。
1 GNUWin32 项目提供了一个名为GetGnuWin32的下载实用程序,它可以一次性下载和安装所有可用的 GNUWin32 软件包(如果这是您的首选)。
记事本++
我个人不知道有任何 Notepad++ 插件或功能完全支持您要完成的工作。但是,Notepad++ 可以直接通过 Notepad++运行...菜单 ( F5) 或 NppExec 插件运行批处理脚本、命令和可执行文件,因此可以(在某种程度上)与 GNUWin32 实用程序一起使用。
话虽如此,我不确定将单独的打开文件作为一个组提供给上面列出的任何内容的良好机制。一种部分解决方法是将两个文件合并为一个,对它们进行排序,保存文件,然后针对该保存的文件运行此答案后面给出的“单个文件输出”示例批处理文件的变体。
Notepad++ 确实支持通过Python Script for Notepad++ 插件(基于 Python 2.7 的自包含版本)与编辑器进行更多低级交互。不幸的是,我对该插件的经验有限,所以我不确定它如何能够帮助您实现所需的功能(如果有的话)。
如果您想自己尝试使用 Python Script for Notepad++ 插件,您可以在 Notepad++ 的Plugins → Plugins Admin...界面下安装它。
GNUWin32 批处理示例
下面给出的批处理 (
.bat
) 文件示例利用了 GNUWin32 实用程序,旨在展示一些(希望)实现目标的基本方法。但它们只是参考。几乎可以肯定,它们可以一起改进甚至忽略,以支持其他方法。这些批处理文件假定安装了 GNUWin32 CoreUtils包(用于
sort
,uniq
和comm
实用程序)。使用的示例comm
还需要sed(一个单独的包)。为了完整起见,以下(最小)文本文件用作下面概述的示例脚本的测试输入:
前任。dup1.txt
独特线:
123
--
前任。dup2.txt
独特线:
jkl
示例批处理 - 单个文件输出
结合例如 GNUWin32 CoreUtils 包,您可以创建一个 Windows 批处理文件,该文件支持将两个文本文件拖放到上面,然后将不重复的行显示为在 ex. 中打开的第三个单个文件。记事本++:
前任。nodupes.bat
请注意,在上面的示例中,
gnu-sort
是 GNUWin32sort
实用程序,已重命名以避免 Windows 中的冲突(请参阅Windows 冲突部分)。虽然为了方便起见,可以在“拖放”模式下使用此批处理文件,但您也可以直接在命令行中传递相关文件名,例如
nodupes.bat dup1.txt dup2.txt
. 本节中的其他批处理示例也是如此。示例批处理 - 单个文件输出 (Notepad++)
要在 Notepad++ 中更直接地实现类似的功能,您可以创建一个类似于上面已经描述的新批处理文件,但只有一个输入:
前任。nodupes-npp.bat
然后,您可以将此
.bat
文件保存在静态位置以供 Notepad++ 参考。然后,在 Notepad++ 中,例如在Run...菜单 ( F5) 下,您可以为当前打开的任何(单个)文件调用此批处理文件:但是,这种方法存在一些注意事项:
1)当前打开的文件需要是您希望比较数据的两个文件的组合版本。
.bat
2)在使用此/ Run...方法之前,必须保存您希望应用它的文件。这是因为:"$(FULL_CURRENT_PATH)"
在保存文件之前在 Notepad++ 中不可用。如果对文件进行了更改,则需要对正在访问的实际文件应用任何更新(即磁盘上的版本,而不是当前在 Notepad++ 中打开的版本)。
示例批处理 - 多文件输出
如果您想要由原始文件(相对)划分的唯一行,您可以改用
comm
andsed
的组合:前任。nodupes-separated.bat
前任。过滤器.sed
请注意,虽然
comm
是 CoreUtils 包的一部分,但sed 是与 GNUWin32 一起单独下载的。请记住,上面的批处理文件不会改变您的原始文件,它会创建两个新文件(因此重命名它们取决于您)。此外,如书面,前。filter.sed
需要与批处理文件位于同一目录中(例如nodupes-separated.bat
)。Windows 冲突 (GNUWin32)
GNUWin32 包含一些与 Windows 实用程序或命令同名的实用程序(例如
sort
)。这可能会带来(轻微的)问题,因为每个实用程序的运行方式可能不同。我个人在 GNUWin32 CoreUtils 包中意识到的冲突是:请记住,单独的包中也可能存在其他冲突,例如
tree
.如果您想从您的环境路径访问 GNUWin32 版本(即不输入其完整路径),您可以自己重命名适当的 GNUWin32 可执行文件(推荐)或使用名称不同的代理批处理文件(不太理想)。代理批处理文件将仅包含例如:
前任。gnu-utility.bat
使用 Windows 实用程序版本
您也许可以使用 Windows 版本的实用程序,但它们可能需要修改您处理事情的方式。例如,
sort
默认情况下,Windows 一次只能接受一个输入,因此nodupes.bat
上面的原始示例在使用时可能如下所示:前任。nodupes-win-sort.bat
注释 (GNUWin32)
要使 GNUWin32 实用程序在不指定完整路径的情况下工作,您需要将它们添加到 Windows 中的环境路径中。否则,您将需要指定每个可执行文件的完整路径(请注意,这可能会导致头痛,例如使用管道)。
GNUWin32 软件包可以说最好放在您创建的“常规”Windows 文件夹中(即不是
C:\Program Files
,C:\Program Files (x86)
或您的User
文件夹)。您还应该尝试将 GNUWin32 安装到没有空格的路径中(例如
C:\Programs\GNUWin32
)。虽然 GNUWin32 CoreUtils 包支持各种基本工具,但仍有相当多的实用程序可以作为它们自己的单独包或实用程序组使用。此外,某些实用程序的工作方式可能略有不同或具有更多有限的选项/语法,这仅仅是因为底层操作系统(Windows)不是例如 Linux。