当然可以,但就像大多数批处理文本文件一样,它并不漂亮,而且不是特别快。
该解决方案在查找重复项时忽略大小写,并对行进行排序。文件名作为第一个也是唯一一个参数传递给批处理脚本。
@echo off
setlocal disableDelayedExpansion
set "file=%~1"
set "sorted=%file%.sorted"
set "deduped=%file%.deduped"
::Define a variable containing a linefeed character
set LF=^
::The 2 blank lines above are critical, do not remove
sort "%file%" >"%sorted%"
>"%deduped%" (
set "prev="
for /f usebackq^ eol^=^%LF%%LF%^ delims^= %%A in ("%sorted%") do (
set "ln=%%A"
setlocal enableDelayedExpansion
if /i "!ln!" neq "!prev!" (
endlocal
(echo %%A)
set "prev=%%A"
) else endlocal
)
)
>nul move /y "%deduped%" "%file%"
del "%sorted%"
该解决方案区分大小写,并且保留行的原始顺序(当然重复项除外)。文件名再次作为第一个也是唯一的参数传入。
@echo off
setlocal disableDelayedExpansion
set "file=%~1"
set "line=%file%.line"
set "deduped=%file%.deduped"
::Define a variable containing a linefeed character
set LF=^
::The 2 blank lines above are critical, do not remove
>"%deduped%" (
for /f usebackq^ eol^=^%LF%%LF%^ delims^= %%A in ("%file%") do (
set "ln=%%A"
setlocal enableDelayedExpansion
>"%line%" (echo !ln:\=\\!)
>nul findstr /xlg:"%line%" "%deduped%" || (echo !ln!)
endlocal
)
)
>nul move /y "%deduped%" "%file%"
2>nul del "%line%"
EDIT
上面的两种解决方案都去除了空行。我认为在谈论不同的值时不值得保留空行。
我修改了这两种解决方案以禁用 FOR /F "EOL" 选项,以便保留所有非空白行,无论第一个字符是什么。修改后的代码将 EOL 选项设置为换行符。
新解决方案2016-04-13:JSORT.BAT
你可以用我的使用简单的一个衬垫有效地排序和删除重复的行(加上一个 MOVE 以用最终结果覆盖原始文件)。 JSORT 是纯脚本,可以在 XP 及以上版本的任何 Windows 计算机上本机运行。
@jsort file.txt /u >file.txt.new
@move /y file.txt.new file.txt >nul