使用批处理文件删除重复的文本行
Deleting duplicate text lines using a batch file
我正在创建一个文本文件,显示文件夹中每个文件的文件扩展名。我想删除重复项,因为它会为每个文件创建一行文本。
经过一番搜索,我发现我应该使用 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 文件。
我很乐意提供一些帮助。
您可以立即创建文件 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
,如果找到 none,则设置为 1
.
根据返回的 ErrorLevel
,是否回显 %%~xA
中当前迭代的文件扩展名并重定向到 filtered.txt
。因此,如果 filtered.txt
已经包含当前项目,则不会回显,但如果没有遇到匹配项,则会将该项目附加到文件中。
第一行为find
创建一个空文件filtered.txt
,以免第一次执行失败。
如果您想使用文件 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
)而不是直接枚举当前目录。
我正在创建一个文本文件,显示文件夹中每个文件的文件扩展名。我想删除重复项,因为它会为每个文件创建一行文本。
经过一番搜索,我发现我应该使用 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 文件。 我很乐意提供一些帮助。
您可以立即创建文件 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
,如果找到 none,则设置为 1
.
根据返回的 ErrorLevel
,是否回显 %%~xA
中当前迭代的文件扩展名并重定向到 filtered.txt
。因此,如果 filtered.txt
已经包含当前项目,则不会回显,但如果没有遇到匹配项,则会将该项目附加到文件中。
第一行为find
创建一个空文件filtered.txt
,以免第一次执行失败。
如果您想使用文件 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
)而不是直接枚举当前目录。