我有两个文件,想要检查批处理脚本中是否有“包含”另一个文件。 'contains'是指第一个文件中的SET行包含第二个文件中的SET行。
例如此文件:
a
b
c
d
e
f
g
包含此文件:
a
b
d
g
但不包含此文件:
a
b
z
我意识到任务不是很复杂,但我想知道是否存在支持开箱即用的类似集合操作的命令行工具。例如,作为编写for循环的替代方法,该循环从第一个文件中的第二个文件中搜索每一行......
答案 0 :(得分:1)
已修改原始帖子中的大多数代码都不需要,所以......
使用您的文件集(以相同顺序)fullList.txt
,list1.txt
和list2.txt
命名,这应该有效
@echo off
setlocal enableextensions disabledelayedexpansion
set "mainFile=.\fullList.txt"
for %%f in (list*.txt) do (
findstr /l /x /v /g:"%mainFile%" "%%~ff" >nul && (
echo %%f is not included
) || (
echo %%f is included
)
)
它是如何工作的?它只是每个文件的findstr
命令。它在“小列表”文件中搜索未包含在“大列表”文件中的字符串。如果找到任何行,则不包含该文件,否则包含该文件
答案 1 :(得分:0)
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
PUSHD "%sourcedir%"
SET "is_subset=Y"
FOR /f "delims=" %%a IN (subset_file.txt) DO (
FIND "%%a" "superset_file.txt">NUL
IF ERRORLEVEL 1 ECHO fail ON "%%a"&SET "is_subset=N"&GOTO done
)
:done
POPD
ECHO subset IN superset : %is_subset%
GOTO :EOF
这应该有用 - 但你的问题不清楚。这将检查超集是否包含子集的每个成员,但您可能正在搜索某些成员。
我在U:
驱动器上使用了测试文件 - 您需要修改以适应。
答案 2 :(得分:0)
下面的解决方案以非常快的方式解决问题。作为附加数据,它显示大文件中未包含的小文件中的行:
@echo off
setlocal
for /F "delims=" %%a in (smallFile.txt) do set "line[%%a]=1"
for /F "delims=" %%a in (largeFile.txt) do set "line[%%a]="
set "anyLine="
for /F %%a in ('set line[ 2^>NUL') do set "anyLine=1"
if defined anyLine (
echo Large file does NOT "contain" the small file. Lines not contained:
echo/
for /F "tokens=2 delims=[]" %%a in ('set line[') do echo %%a
) else (
echo Large file "contain" the small file.
)