1

以下の数値を含む 2 つのテキスト ファイルがあります。

File1
00000
11111

File2
00000
11111
22222

file2 の内容を file1 の内容と比較するコードと、一致しない番号が必要です。この場合、「22222」が file2 の唯一の内容になります。

つまり、file2 のコンテンツを消去し、一致しないコンテンツを file2 に入れたいと考えています。以下は私が試したコードですが、ファイル2の全体を消去するだけです.

setlocal enabledelayedexpansion

for /f "tokens=1" %%a in (file1) do (type file2 | findstr /v %%a > file2)

pause

結論として、以下の結果を達成する必要があります

File1
00000
11111

File2
22222

助けてください !

4

4 に答える 4

7

これが最もシンプルで最速のネイティブ バッチ ソリューションだと思います

findstr /vixg:"File1" "File2" >"File2.new"
move /y "File2.new" "File2"

findstr /i大文字と小文字を区別しないオプションを使用したことに注意してください。これは、またはオプションを使用しない限り、複数のリテラル文字列を検索するときに一致を見逃す可能性があるfindstrのバグのため重要です。数字を扱っているため、大文字と小文字を区別しない回避策は影響しません。/i/r

于 2012-07-13T23:07:28.647 に答える
4

これは仕事をします。 findstr /m それは、オプションとエラーレベルを使用することにかかっています。

また、処理中に一時ファイルに書き込みます (そして消去します)。


@echo off
setlocal enabledelayedexpansion
echo Stripping duplicates in file2 (%2) compared to lines in file1 (%1)

if not exist "%1" (
  echo That first file doesn't exist.
  exit /b 1
)

if not exist "%2" (
  echo That second file doesn't exist.
  exit /b 2
)

REM Create empty temporary file
echo. 2> %2.tmp

for /f "tokens=1" %%a in (%2) do (
  echo Processing %%a
  >nul call findstr /m "%%a" %1
  if errorlevel 1 (
    echo OK
    >> %2.tmp echo %%a
  ) else (
    echo Duplicate!
  )
)


echo Writing results to %2
xcopy /y /q %2.tmp %2
del /q %2.tmp
于 2012-07-13T03:03:28.050 に答える
2

別のアプローチ:

@echo off
setlocal 
for /f %%i in (file1) do set %%i=%%i
for /f %%j in (file2) do if not defined %%j echo %%j 

次の特徴があります: - 各ファイルを 1
だけスキャンします- file1 の重複は事実上無視され ます - file1 をメモリにロードし、それに対して複数の file_x を実行してテストすることができます。

注:
一意の数値をコンソールにエコーするだけです。ファイルに書き込むには、 に変更する必要があります 単語
を比較し、 1 行に 1 つの単語があると仮定します。その数が何なのかわかりません... file1の20,000行で試しました(したがって、20,000の変数が定義されています)

于 2012-07-13T14:21:57.727 に答える
-1

これは解決策の1つです:

findstr /V /G:file1.txt file2.txt
于 2016-09-27T06:50:59.650 に答える