使用批处理文件删除重复的文本行

时间:2015-11-08 22:25:29

标签: batch-file for-loop filter duplicates findstr

我正在创建一个文本文件,显示文件夹中每个文件的文件扩展名。我想摆脱重复,因为它为每个文件创建了一行文本。

经过一些搜索,我发现我应该使用findstr覆盖初始文件,并删除已删除特定扩展名的新版本(在我将其写入过滤后的文件之后)。

for %%A in (*.*) do echo %%~xA >> initial.txt
for /F %%B in (initial.txt) do (
    echo %%B >> filtered.txt
    for /F %%C in (initial.txt) do findstr /v %%C initial.txt > initial.txt
)

但它仍然将初始文件留空(如预期的那样),同时仍然将每一行复制到filtered.txt文件。 我很乐意得到一些帮助。

1 个答案:

答案 0 :(得分:6)

您可以立即创建文件filtered.txt,不需要initial.txt

> "filtered.txt" rem/
for %%A in ("*.*") do (
    > nul find /I "%%~xA" "filtered.txt"
    if ErrorLevel 1 (
        >> "filtered.txt" echo %%~xA
    )
)

我在这里使用find而不是findstr,因为只搜索简单的文字字符串。如果遇到至少一个匹配,则find(如findstr)将ErrorLevel设置为0,如果未找到匹配,则设置为1

根据返回的ErrorLevel%%~xA中当前迭代的文件扩展名会被回显并重定向到filtered.txt。因此,如果filtered.txt已包含当前项目,则不会回显它,但如果未遇到匹配项,则该项目将附加到文件中。

第一行为filtered.txt创建一个空文件find,使其首次执行时不会失败。

如果您仍想使用文件initial.txt,可以执行以下操作:

>> "initial.txt" (
    for %%A in ("*.*") do echo %%~xA
)
> "filtered.txt" rem/
for /F "usebackq eol=| delims=" %%A in ("initial.txt") do (
    > nul find /I "%%~xA" "filtered.txt"
    if ErrorLevel 1 (
        >> "filtered.txt" echo %%~xA
    )
)

此代码几乎与上述相同;唯一的区别是先前创建initial.txt(可能包含重复项),以及其内容的枚举(通过for /F),而不是直接枚举当前目录。