Batch file 如何在Windows中连接两个文本文件并删除重复项

Batch file 如何在Windows中连接两个文本文件并删除重复项,batch-file,Batch File,文件1 文件2 A B C 文件1+2= B C D 是否可以使用cmd.exe执行此操作 第一部分(合并两个文本文件)是可能的。(见附件) 对于第2部分,您可以从中使用排序和uniq实用程序。这是linux实用程序的windows端口 copy file1.txt+file2.txt file1and2.txt 这有一个限制,你将失去原来的排序轨道 更新1 Windows还附带了本机 更新2 下面是使用PowerShell的: sort file1and2.txt filesorted.

文件1

文件2

A
B
C
文件1+2=

B
C
D
是否可以使用cmd.exe执行此操作

第一部分(合并两个文本文件)是可能的。(见附件)

对于第2部分,您可以从中使用
排序
uniq
实用程序。这是linux实用程序的windows端口

copy file1.txt+file2.txt file1and2.txt
这有一个限制,你将失去原来的排序轨道

更新1

Windows还附带了本机

更新2

下面是使用PowerShell的

sort file1and2.txt filesorted.txt
uniq filesorted.txt fileunique.txt

对于
cmd.exe

Get-Content file?.txt | Sort-Object | Get-Unique > result.txt

下面的解决方案假设两个输入文件都使用相同的
IF
命令的比较运算符按升序排序,并且不包含空行

@echo off
type nul > temp.txt
type nul > result.txt,
copy file1.txt+file2.txt temp.txt
for /f "delims=" %%I in (temp.txt) do findstr /X /C:"%%I" result.txt >NUL ||(echo;%%I)>>result.txt
del temp.txt
@echo关闭
setlocal EnableDelayedExpansion
设置“lastLine=ÿ”
对于(1,1,10)中的/L%%i,请设置“lastLine=!lastLine!!lastLine!”
您也可以使用与纯批处理相同的Unix或PowerShell方法,开发一个简单的
uniq.bat
过滤程序:

编辑:下面的程序是
uniq
程序的批处理JScript混合版本,更可靠、更快;将此程序复制到名为
uniq.bat的文件中

@echo off
setlocal EnableDelayedExpansion
set "prevLine="
for /F "delims=" %%a in ('findstr "^"') do (
   if "%%a" neq "!prevLine!" (
      echo %%a
      set "prevLine=%%a"
   )
)
这样,您可以使用此解决方案:

@if (@CodeSection == @Batch) @then

@CScript //nologo //E:JScript "%~F0" & goto :EOF

@end

var line, prevLine = "";
while ( ! WScript.Stdin.AtEndOfStream ) {
   line = WScript.Stdin.ReadLine();
   if ( line != prevLine ) {
      WScript.Stdout.WriteLine(line);
      prevLine = line;
   }
}

但是,在本例中,结果丢失了原始顺序。

如果您可以支持使用不区分大小写的比较,并且如果您知道没有一行的长度超过511字节(对于XP为127),则可以使用以下命令:

(type file1.txt & type file2.txt) | sort | uniq > result.txt

有关限制的说明,请参阅。

两个输入文件都已排序?您希望以相同的顺序输出吗?这并不简单,但用任何编程语言都可以。为什么不使用PowerShell或其他东西?问题并没有说明它是未排序的文件。所包含的示例意味着对文件进行了排序。无论如何,添加限定符file1和2.txt将有
a B C D
。这是步骤1的输出。再读一遍我的答案
file1and2.txt
只是cmd.exe中两个文件的组合。让我们总结一下:即使对
file1.txt
file2.txt
进行了排序,它们的contatation(
file1and2.txt
)不是,因此在对该文件进行
排序之前不能执行
uniq
。没有这样的
cp
命令!要复制的Windows命令是
copy
。使用
(type file1.txt&type file2.txt)| sort | uniq>result.txt
删除中间文件怎么样。uniq的JScript或VBS(或混合JScript/batch)实现将执行得更好、更可靠。标签上写的是批处理文件,但问题只涉及cmd.exe。@dbenham:我喜欢,戴夫!我刚刚修改了我的答案,包括:-)Windows排序不区分大小写,因此如果大小写很重要,这可能不会给出正确的结果。是的,有趣的是,我们在这个问题上阐述了这么多,但OP还没有回答!我添加了uniq.+1的批处理JScript版本,但是file2.txt的唯一行将出现在file1.txt之后。这不是原始顺序,也不是排序顺序…@Aacini-合并数据的“原始顺序”是什么?合并后的数据以前从未以任何顺序存在过,那么它怎么可能具有原始顺序呢?我的意思是,您使用
file2 file1
顺序中的文件的方法将生成:
B C D A
,也就是说,只保留了第一个文件的顺序…@Aacini-实际上,它生成“A B C D”,因为它首先复制了整个文件1,然后从文件2中追加新记录。但我很不安地说,这或任何其他秩序,是“原始”秩序。也许我没有正确地表达自己。我的第一个解决方案以两个排序输入文件的相同顺序生成结果。所有其他解决方案都会生成一个排序结果,因为要使该方法工作,需要
排序
findstr
方法不会生成排序结果。或者甚至不会生成稍短的结果(对于PowerShell):
Get Content file?.txt | Sort Object-Unique>result.txt
@if (@CodeSection == @Batch) @then

@CScript //nologo //E:JScript "%~F0" & goto :EOF

@end

var line, prevLine = "";
while ( ! WScript.Stdin.AtEndOfStream ) {
   line = WScript.Stdin.ReadLine();
   if ( line != prevLine ) {
      WScript.Stdout.WriteLine(line);
      prevLine = line;
   }
}
(type file1.txt & type file2.txt) | sort | uniq > result.txt
@echo off
copy file1.txt merge.txt >nul
findstr /lvxig:file1.txt file2.txt >>merge.txt
type merge.txt