4

ファイル 1

A
B
C

ファイル 2

B
C
D

ファイル1 + ファイル2 =

A
B
C
D

cmd.exe を使用して行うことは可能ですか?

4

5 に答える 5

9

大文字と小文字を区別しない比較を使用する余裕があり、511 バイト (XP の場合は 127) を超える行がないことがわかっている場合は、次を使用できます。

@echo off
copy file1.txt merge.txt >nul
findstr /lvxig:file1.txt file2.txt >>merge.txt
type merge.txt

制限の説明については、「Windows FINDSTR コマンドの文書化されていない機能と制限事項は何ですか?」を参照してください。.

于 2013-11-06T17:49:42.553 に答える
7

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
于 2013-11-06T16:58:56.617 に答える
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"
   )
)

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

ただし、この場合、結果は元の順序を失いました。

于 2013-11-06T17:39:42.583 に答える