批量删除文本文件中的重复行

Roc*_*shy 11 windows batch-file

是否可以从文本文件中删除重复的行?如果有,怎么样?

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)

  • @Dreadedsemicolon-是的,我没有提到如果由于FINDSTR限制,如果任何行超过长度511(XP上为127),第二个选项就会失败。 (2认同)

asc*_*pfl 5

前段时间我发现了一个出乎意料的简单解决方案,但不幸的是这只适用于 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)。

但是,您应该谨慎使用这些选项,因为它们可能存在一些(未知)已知的问题,因为可能有充分的理由不记录它们(到目前为止)。