dbe*_*ham 13
当然可以,但像批量处理的大多数文本文件一样,它并不漂亮,而且速度也不是特别快.
这个解决方案在查找重复项时会忽略大小写,并对行进行排序.文件名作为批处理脚本的第一个也是唯一的参数传入.
@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%"
Run Code Online (Sandbox Code Playgroud)
此解决方案区分大小写,它以原始顺序保留行(当然,重复除外).同样,文件的名称作为第一个和唯一的参数传入.
@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%"
Run Code Online (Sandbox Code Playgroud)
编辑
以上两种解决方案均为空白行.在谈论不同的价值观时,我并不认为空白行是值得保留的.
我修改了两个解决方案以禁用FOR/F"EOL"选项,以便保留所有非空行,无论第一个字符是什么.修改后的代码将EOL选项设置为换行符.
新解决方案2016-04-13:JSORT.BAT
您可以使用我的JSORT.BAT混合JScript /批处理实用程序,使用简单的一行(有一个MOVE来覆盖原始文件和最终结果)来有效地排序和删除重复的行.JSORT是纯脚本,可以在XP之后的任何Windows机器上本机运行.
@jsort file.txt /u >file.txt.new
@move /y file.txt.new file.txt >nul
Run Code Online (Sandbox Code Playgroud)
前段时间我发现了一个出乎意料的简单解决方案,但不幸的是这只适用于 Windows 10:该sort命令具有一些可以采用的未记录的选项:
/UNIQ[UE]仅输出唯一的行;/C[ASE_SENSITIVE]区分大小写排序;因此,使用以下代码行删除重复行(删除/C以不区分大小写的方式执行此操作):
sort /C /UNIQUE "incoming.txt" /O "outgoing.txt"
Run Code Online (Sandbox Code Playgroud)
这会从 中的文本中删除重复行incoming.txt并在 中提供结果outgoing.txt。考虑到原始顺序当然不会被保留(因为,嗯,这是 的主要目的sort)。
但是,您应该谨慎使用这些选项,因为它们可能存在一些(未知)已知的问题,因为可能有充分的理由不记录它们(到目前为止)。
| 归档时间: |
|
| 查看次数: |
40979 次 |
| 最近记录: |