我有2个txt文件:
1.txt
15 green
8 blue
9 pink
12 red
2.txt
15 yellow
8 blue
17 red
14 pink
我希望 Final.txt 包含 2.txt 中的所有行 + 仅 1.txt 中的行(如果该行包含不同颜色)。所以final.txt只能有一种颜色。顺序并不重要。
在我按照他的建议删除 /E 后,@Mofi 的解决方案完美运行!
最终.txt
15 green
15 yellow
8 blue
17 red
14 pink
可以使用以下批处理代码:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "FileMain=2.txt"
set "FileResult=Result.txt"
set "FileSupplementary=1.txt"
if exist "%FileMain%" goto CheckSupplementary
echo ERROR: File "%FileMain%" not found.& goto ErrorPause
:CheckSupplementary
if exist "%FileSupplementary%" goto ProcessFiles
echo ERROR: File "%FileSupplementary%" not found.
:ErrorPause
echo(
pause
exit /B 1
:ProcessFiles
(
for /F "usebackq tokens=1*" %%I in ("%FileSupplementary%") do if not "%%J" == "" %SystemRoot%\System32\findstr.exe /E /L /M /C:" %%J" "%FileMain%" >nul || echo(%%I %%J
type "%FileMain%"
)>"%FileResult%"
endlocal
主
for /F
循环使用普通空格和水平制表符作为分隔符,将文件 1.txt
中不以分号开头的每个非空行拆分为两个子字符串。第一个子字符串是数字,根据 ASCII表,分配给指定的循环变量
I
,数字后面的空格/制表符之后的行的其余部分分配给下一个循环变量 J
。
FINDSTR 用于区分大小写,并在行尾逐字搜索分配给循环变量
J
的字符串,该字符串永远不应该是之前通过简单字符串比较验证的空字符串。
注意: 如果文件
1.txt
包含类似 28 purple
的行并且文件 2.txt
包含类似 20 brown and purple
的行,则可能出现误报。在这种情况下,来自 28 purple
的行 1.txt
不在 Result.txt
中,因为 2.txt
中也有一行以空格和 purple
结尾。如果不知道从文件中读取的行中哪些字符位于行开头的数字之后,正则表达式的使用就并非易事。如果在文件 1.txt
中的行末尾找不到分配给循环变量
1.txt
的字符串且之前没有正常空格,则从文件 J
读取的行将具有单个正常空格输出。文件 2.txt
中的所有输出行首先写入
1.txt
,最后附加文件 Result.txt
中的所有行。如果两个输入文件在数字和行的其余部分(颜色名称)之间使用水平制表符而不是一个或多个空格,则 2.txt
和
/C:" %%J"
中的空格字符应替换为水平制表符。请进一步注意,如果该行在第一个文本文件中具有尾随空格字符,而在第二个文本文件中具有相同颜色名称的行中没有尾随空格,则具有颜色名称的行也可能在结果文件中出现两次,反之亦然。可以删除 FINDSTR 选项 echo(%%I %%J
并删除使用选项
/E
定义的搜索字符串中 %%J
左侧的空格/制表符,以便通过允许字符串左右的所有内容来减少查找的限制。在文件/C:
中查找。但这可能会导致更多误报,具体取决于两个文本文件中的真实字符串。注意: 文件中的尾随空格 2.txt
在颜色名称之后,并且文件中的尾随空格
1.txt
与相同颜色名称的行相同,即使不使用选项 2.txt
也会导致最终从两者中获得颜色名称结果文件中的文件。要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
/E
echo /?
endlocal /?
exit /?
findstr /?
for /?
goto /?
if /?
pause /?
setlocal /?
,了解无条件命令运算符 type /?
和条件命令运算符
&
的说明。阅读有关 使用命令重定向运算符的 Microsoft 文档,了解 ||
的说明。
应该按照您的要求进行操作,提供您提供的数据,但不是按照您提供的顺序。
请注意,第一个文件显示“12 red”,但第二个文件显示“17 red”