这是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 可能会给出错误的结果。)
用排序后的文件替换原始文件的代码被注释掉了。只需删除 REM 语句即可激活 MOVE 语句。
与 kiswa 的回答一样,上面的内容只会输出 list.txt 中与keywords.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