我有两个包含以下数字的文本文件
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
请帮忙!
答案 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