Batch file 在批处理脚本中比较两个文件
我试着以这样的方式比较两个文件,文件1的每一行将与文件2的每一行进行比较,如果没有找到匹配项,则将该行写入一个单独的文件 下面是我写的代码,但它没有按预期工作Batch file 在批处理脚本中比较两个文件,batch-file,file-comparison,Batch File,File Comparison,我试着以这样的方式比较两个文件,文件1的每一行将与文件2的每一行进行比较,如果没有找到匹配项,则将该行写入一个单独的文件 下面是我写的代码,但它没有按预期工作 @echo on cd path for /f %%a in (file1.txt) do ( for /f %%b in (file2.txt) do ( if %%a==%%b ( echo lines are same ) else ( echo %%a >> file3.txt ) ) ) 我得到一个错误,命令的语法
@echo on
cd path
for /f %%a in (file1.txt) do (
for /f %%b in (file2.txt) do (
if %%a==%%b
(
echo lines are same
) else (
echo %%a >> file3.txt
)
)
)
我得到一个错误,命令的语法不正确。
请帮我解决这个问题。语法错误是由错误放置的左括号引起的,但即使这样,代码也不能按预期工作 您可以将file1中的每一行与file2中的每一行进行比较,但您可以为每一个不相等的比较进行输出,而不仅仅是在没有找到匹配项时
for /f %%a in (file1.txt) do (
set "matchFound="
for /f %%b in (file2.txt) do (
if %%a==%%b (
echo lines are same
set matchFound=1
)
)
if not defined matchFound (
echo %%a is not found in file2
)
)
试一试:
@echo on
cd /d "c:\path"
del file3.txt 2>nul
for /f "delims=" %%a in (file1.txt) do (
set "flag="
for /f "delims=" %%b in (file2.txt) do (
if "%%a"=="%%b" set flag=1
)
if not defined flag >>file3.txt echo %%a
)
如果您的文件很大并且需要速度,那么为file2的内容设置一个数组将显著加快速度
这也可以使用更简单的代码,但取决于file1的内容
@echo on
cd /d "c:\path"
del file3.txt 2>nul
for /f "delims=" %%a in (file1.txt) do (
findstr "^%%a$" file2.txt >nul || >>file3.txt echo %%a
)
foxidrive显示的FINDSTR方法无疑是解决问题的最快的纯批处理方法,尤其是在file2很大的情况下。但是,有许多情况可能导致它失败:文件1中的regex元字符、文件1中的引号和/或反斜杠等。有关所有潜在问题,请参阅。多做一点工作可以使解决方案更可靠
- 搜索应显式设置为文本
- 搜索应完全匹配(整行)
- 搜索行中的任何反斜杠都应转义为
\\
- 每次搜索都应存储在临时文件中,并使用
选项\G:file
和
的默认delims
选项,FOR/F语句将只读取每行的第一个单词。我怀疑你想把delims设置为nothing。您还希望禁用eol
选项,以便以开头的行代码>不会被跳过。这需要一些奇怪的语法。我添加了usebackq
选项,以防处理必须引用的文件名
@echo off
setlocal disableDelayedExpansion
set "file1=file1.txt"
set "file2=file2.txt"
set "file3=file3.txt"
set "search=%temp%\search.txt"
>"%file3%" (
for /f usebackq^ delims^=^ eol^= %%A in ("%file1%") do if "%%A" neq "" (
set "ln=%%A"
setlocal enableDelayedExpansion
(echo(!ln:\=\\!) >"%search%"
findstr /lxg:"%search%" "%file2%" >nul || (echo(!ln!)
endlocal
)
)
del "%search%" 2>nul
如果您的文件2不包含\“
,并且您可以进行不区分大小写的搜索,则有一种非常快速的单行解决方案:只需反转FINDSTR搜索,查找文件1中不存在于文件2中的任何行。由于存在大小写差异,搜索必须不区分大小写
如果由于转义问题,文件2包含\“
,则此操作将不起作用。您可以预处理file2并转义所有\
,但是如果您将自己限制为纯批处理解决方案,那么您也可以使用第一个解决方案
如果您愿意使用,那么我有一个非常简单有效的解决方案。BAT对stdin的每一行执行regex搜索和替换操作,并将结果写入stdout
假设REPL.BAT在您当前的目录中,或者更好地说,在您的路径中的某个地方:
@echo off
setlocal
set "file1=file1.txt"
set "file2=file2.txt"
set "file3=file3.txt"
set "search=%temp%\search.txt"
type "%file2%"|repl \\ \\ >"%search%"
findstr /livxg:"%search%" "%file1%" >"%file3%"
del "%search%" 2>nul
请注意,此解决方案仍然必须执行不区分大小写的比较。为什么不使用FC
命令?从帮助IF/?
中,括号必须在同一行<代码>如果%%a==%%b(
@npocmaka-FC命令不会给出OP所需的输出。它还依赖于行顺序,因此完全不适合此问题。
@echo off
setlocal
set "file1=file1.txt"
set "file2=file2.txt"
set "file3=file3.txt"
set "search=%temp%\search.txt"
type "%file2%"|repl \\ \\ >"%search%"
findstr /livxg:"%search%" "%file1%" >"%file3%"
del "%search%" 2>nul