如何合并两个文本文件,但只添加Windows批处理文件中第一个文件中缺少的行?

shyt4zoc  于 2023-05-30  发布在  Windows
关注(0)|答案(2)|浏览(389)

我有两个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只能有一种颜色。秩序并不重要。
Final.txt

15 green
15 yellow
8 blue
17 red
14 pink
rxztt3cl

rxztt3cl1#

SETLOCAL
rem The following settings for the directories and filenames are names
rem The following setting for the directory is a name
rem that I use for testing and deliberately includes spaces to make sure

rem that the process works using such names. These will need to be changed to suit your situation.

SET "sourcedir=u:\your files"
SET "destdir=u:\your results"
SET "filename1=%sourcedir%\q76356312.txt"
SET "filename2=%sourcedir%\q76356312_2.txt"
SET "outfile=%destdir%\outfile.txt"

(
 TYPE "%filename1%"
 FINDSTR /x /v /g:"%filename1%" <"%filename2%"
)>"%outfile%"

GOTO :EOF

应该按照您的要求,提供您提供的数据,但不是按照您提供的顺序。
请注意,第一个文件显示“12red”,但第二个文件显示“17red”

rmbxnbpk

rmbxnbpk2#

可以使用以下批次代码:

@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的行,则可能出现误报。从1.txt开始的线28 purple在这种情况下不在Result.txt中,因为在2.txt中有一条线也以空格和purple结束。如果不知道从文件1.txt读取的一行中,行首的数字后面可能有哪些字符,那么正则表达式的使用就很重要。

如果在2.txt文件中的一行末尾找不到指定给循环变量J的字符串,则从1.txt文件中读取的行将带有一个普通空格。
文件1.txt的所有输出行首先写入Result.txt,最后将文件2.txt中的所有行附加到Result.txt上。
要了解所使用的命令及其工作方式,请打开command prompt窗口,在其中执行以下命令,并完整仔细地阅读每个命令的帮助页面。

  • echo /?
  • endlocal /?
  • exit /?
  • findstr /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • setlocal /?
  • type /?

另请参阅single line with multiple commands using Windows batch file以了解无条件命令运算符&和条件命令运算符||的解释。
阅读有关Using command redirection operators的Microsoft文档,了解>nul的说明。

相关问题