ファイル 1
A
B
C
ファイル 2
B
C
D
ファイル1 + ファイル2 =
A
B
C
D
cmd.exe を使用して行うことは可能ですか?
大文字と小文字を区別しない比較を使用する余裕があり、511 バイト (XP の場合は 127) を超える行がないことがわかっている場合は、次を使用できます。
@echo off
copy file1.txt merge.txt >nul
findstr /lvxig:file1.txt file2.txt >>merge.txt
type merge.txt
制限の説明については、「Windows FINDSTR コマンドの文書化されていない機能と制限事項は何ですか?」を参照してください。.
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
純粋な 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"
)
)
EDIT : 以下のプログラムは、バッチと JScript のハイブリッド バージョンのuniq
プログラムで、より信頼性が高く高速です。このプログラムを というファイルにコピーします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
ただし、この場合、結果は元の順序を失いました。