用于比较文本文件内容的批处理文件

时间:2012-07-12 22:06:01

标签: file batch-file compare

我有两个包含以下数字的文本文件

File1
00000
11111

File2
00000
11111
22222

我需要一个代码,用于将file2的内容与file1的内容进行比较,以及不匹配的数字,在这种情况下,'22222'是file2中的唯一内容。

简而言之,我想删除file2的内容并将不匹配的内容放在file2中。下面是我尝试过的代码,但它只是删除了file2中的整个内容。

setlocal enabledelayedexpansion

for /f "tokens=1" %%a in (file1) do (type file2 | findstr /v %%a > file2)

pause

底线我需要达到以下效果

File1
00000
11111

File2
22222

请帮忙!

4 个答案:

答案 0 :(得分:7)

我认为这是最简单,最快速的原生批量解决方案

findstr /vixg:"File1" "File2" >"File2.new"
move /y "File2.new" "File2"

请注意,我使用了findstr /i不区分大小写的选项。这很重要,因为findstr bug会在搜索多个文字字符串时导致错过匹配,除非使用/i/r选项。不区分大小写的解决方法不应该影响您,因为您正在处理数字。

答案 1 :(得分:4)

这可以胜任。它取决于使用 findstr /m 选项和错误级别。

它还会在处理期间写入临时文件(并清除它)。


@echo off
setlocal enabledelayedexpansion
echo Stripping duplicates in file2 (%2) compared to lines in file1 (%1)

if not exist "%1" (
  echo That first file doesn't exist.
  exit /b 1
)

if not exist "%2" (
  echo That second file doesn't exist.
  exit /b 2
)

REM Create empty temporary file
echo. 2> %2.tmp

for /f "tokens=1" %%a in (%2) do (
  echo Processing %%a
  >nul call findstr /m "%%a" %1
  if errorlevel 1 (
    echo OK
    >> %2.tmp echo %%a
  ) else (
    echo Duplicate!
  )
)


echo Writing results to %2
xcopy /y /q %2.tmp %2
del /q %2.tmp

答案 2 :(得分:2)

不同的方法:

@echo off
setlocal 
for /f %%i in (file1) do set %%i=%%i
for /f %%j in (file2) do if not defined %%j echo %%j 

它具有以下特征:
- 仅扫描每个文件一次
- 文件1中的重复项将被有效忽略
- 你可以将file1加载到内存中,然后对它运行几个file_x进行测试。

备注:
我只是将独特的nums回显给控制台,你需要改为写入文件
假设您比较单词并且每行一个单词
它受可能定义的最大变量数量的限制。我不知道那个号码是什么......我在file1中用20 000行尝试了它(因此定义了20 000个vars)

答案 3 :(得分:-1)

这可能是解决方案之一:

findstr /V /G:file1.txt file2.txt