如何合并两个文本文件,但仅添加 Windows 批处理文件中第一个文件中缺少的行? [已关闭]

问题描述 投票:0回答:2

我有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
windows batch-file cmd
2个回答
0
投票

可以使用以下批处理代码:

@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 /?
  • 
    
  • 另请参阅
使用 Windows 批处理文件的单行多个命令

,了解无条件命令运算符 type /? 和条件命令运算符

&
的说明。
阅读有关 

使用命令重定向运算符

的 Microsoft 文档,了解 ||的说明。

    


0
投票
应该按照您的要求进行操作,提供您提供的数据,但不是按照您提供的顺序。

请注意,第一个文件显示“12 red”,但第二个文件显示“17 red”

© www.soinside.com 2019 - 2024. All rights reserved.