これは、kiswaの回答の改善および簡略化されたバージョンです。
@echo off
(
for /f "usebackq" %%A in ("keywords.txt") do findstr /bl "%%A" list.txt
)>sorted.txt
REM move /y sorted.txt list.txt
FINDSTR コマンドは、キーワードで始まる行のみに一致し、検索をリテラル検索に強制します。/L
(オプションが指定されておらず、キーワードにたまたま正規表現のメタ文字が含まれている場合、FINDSTR は間違った結果を返す可能性があります。)
元のファイルをソート済みファイルに置き換えるコードはコメントアウトされています。MOVE ステートメントをアクティブにするには、REM ステートメントを削除するだけです。
kiswa の回答と同様に、上記は、keywords.txt のキーワードに一致する list.txt の行のみを出力します。
キーワードに一致しない行が list.txt に含まれている可能性があります。ソートされた出力の下部にあるこれらの行を保持する場合は、次を使用します。
@echo off
(
for /f "usebackq" %%A in ("keywords.txt") do findstr /bli "%%A" "list.txt"
findstr /vblig:"keywords.txt" "list.txt"
)>sorted.txt
::move /y sorted.txt list.txt
/I
長さの異なる複数のリテラル検索文字列を処理する FINDSTR のバグのため、(大文字と小文字を区別しない) オプションを使用する必要があることに注意してください。この/I
オプションはバグを回避しますが、キーワードで大文字と小文字が区別されると問題が発生します。Windows FINDSTR コマンドの文書化されていない機能と制限事項は何ですか? を参照してください。.
list.txt にないキーワードがある可能性があります。これらのキーワードを後に続くデータなしで含める場合は、次を使用します。
@echo off
(
for /f "usebackq" %%A in ("keywords.txt") do findstr /bl "%%A" "list.txt" || echo %%A
)>sorted.txt
::move /y sorted.txt list.txt
明らかに、両方の手法を組み合わせて、両方のファイルの結合を確実に保持することができます。
@echo off
(
for /f "usebackq" %%A in ("keywords.txt") do findstr /bli "%%A" "list.txt" || echo %%A
findstr /vblig:"keywords.txt" "list.txt"
)>sorted.txt
::move /y sorted.txt list.txt
上記はすべて、キーワードにスペースやタブ文字が含まれていないことを前提としています。その場合、FOR /F オプションと FINDSTR オプションを変更する必要があります。
@echo off
(
for /f "usebackq delims=" %%A in ("keywords.txt") do findstr /bic:"%%A" "list.txt" || echo %%A
findstr /vblig:"keywords.txt" "list.txt"
)>sorted.txt
::move /y sorted.txt list.txt