1

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

File1
00000
11111

File2
00000
11111
22222

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

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

setlocal enabledelayedexpansion

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

pause

底线我需要达到以下结果

File1
00000
11111

File2
22222

请帮忙 !

4

4 回答 4

7

我认为这是最简单最快的原生批处理解决方案

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

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

于 2012-07-13T23:07:28.647 回答
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
于 2012-07-13T03:03:28.050 回答
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 

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

注意:
我只是将唯一的数字回显到控制台,您需要更改为写入文件
假设您比较单词并且每行 有一个单词
它受到可能定义的最大变量数的限制。我不知道那个数字是什么......我在 file1 中尝试了 20 000 行(所以定义了 20 000 个变量)

于 2012-07-13T14:21:57.727 回答
-1

这可以是解决方案之一:

findstr /V /G:file1.txt file2.txt
于 2016-09-27T06:50:59.650 回答