档案1
A
B
C
文件2
B
C
D
file1 + file2 =
A
B
C
D
是否可以使用cmd.exe?
答案 0 :(得分:8)
如果您可以使用不区分大小写的比较,并且如果您知道没有任何行超过511个字节(XP为127),那么您可以使用以下内容:
@echo off
copy file1.txt merge.txt >nul
findstr /lvxig:file1.txt file2.txt >>merge.txt
type merge.txt
有关限制的说明,请参阅What are the undocumented features and limitations of the Windows FINDSTR command?。
答案 1 :(得分:6)
使用PowerShell:
Get-Content file?.txt | Sort-Object | Get-Unique > result.txt
cmd.exe
:
@echo off
type nul > temp.txt
type nul > result.txt,
copy file1.txt+file2.txt temp.txt
for /f "delims=" %%I in (temp.txt) do findstr /X /C:"%%I" result.txt >NUL ||(echo;%%I)>>result.txt
del temp.txt
答案 2 :(得分:4)
第一部分(合并两个文本文件)是可能的。 (见Documentation of copy
command)
copy file1.txt+file2.txt file1and2.txt
对于第2部分,您可以使用CoreUtils for Windows中的sort
和uniq
实用程序。这是linux实用程序的Windows端口。
sort file1and2.txt filesorted.txt
uniq filesorted.txt fileunique.txt
这有一个限制,你将失去对原始测序的追踪。
更新1
Windows还附带本机SORT.EXE。
更新2
答案 3 :(得分:3)
您也可以使用与纯Batch相同的Unix或PowerShell方法,开发一个简单的uniq.bat
过滤器程序:
@echo off
setlocal EnableDelayedExpansion
set "prevLine="
for /F "delims=" %%a in ('findstr "^"') do (
if "%%a" neq "!prevLine!" (
echo %%a
set "prevLine=%%a"
)
)
编辑:以下程序是uniq
程序的Batch-JScript混合版本,更可靠,更快速;将此程序复制到名为uniq.bat
的文件中:
@if (@CodeSection == @Batch) @then
@CScript //nologo //E:JScript "%~F0" & goto :EOF
@end
var line, prevLine = "";
while ( ! WScript.Stdin.AtEndOfStream ) {
line = WScript.Stdin.ReadLine();
if ( line != prevLine ) {
WScript.Stdout.WriteLine(line);
prevLine = line;
}
}
这样,您可以使用此解决方案:
(type file1.txt & type file2.txt) | sort | uniq > result.txt
但是,在这种情况下,结果会丢失原始订单。
答案 4 :(得分:0)
下面的解决方案假设两个输入文件都使用IF
命令的比较运算符的相同顺序按升序排序,并且不包含空行。
@echo off
setlocal EnableDelayedExpansion
set "lastLine=ÿ"
for /L %%i in (1,1,10) do set "lastLine=!lastLine!!lastLine!"
< file1.txt (
for /F "delims=" %%a in (file2.txt) do (
set "line2=%%a"
if not defined line1 set /P line1=
if "!line1!" lss "!line2!" call :advanceLine1
if "!line1!" equ "!line2!" (
echo !line1!
set "line1="
) else (
echo !line2!
)
)
)
if "!line1!" neq "%lastLine%" echo !line1!
goto :EOF
:advanceLine1
echo !line1!
set "line1="
set /P line1=
if not defined line1 set "line1=%lastLine%"
if "!line1!" lss "!line2!" goto advanceLine1
exit /B