分享我的生活
分享能使人快乐

教你怎么去除文本文件中重复的行

同学传给我一个html格式的收藏夹,经过一段时间的访问,发现这个文件中的许多记录都是重复的,而且是大量的重复,我知道linux的shell命令应该能处理,用正则也可以吧,可是现在该怎么弄呢?

于是经过一段时间的搜索,发现了三种方法

一、网上有不少的txt文本去重工具,不过我没有尝试,因为我下载的两个都不会用:一个卡巴不让运行,另一个太复杂,不好用,需要的话你自己找找吧

二、使用bat处理文件

把需要处理的文件存储为 test.txt  ,把下面的代码保存问XX.bat文件,两个文件放在同一个文件夹下,直接运行XX.bat文件,结果保存在sort.txt中

@echo off
:: mode con lines=25
:: 解决问题的思路:
:: 比较相邻三行的内容
:: 如果前两行内容相等并且与第三行不相等则取第二行的内容放入repetition.txt
:: 如此循环
:: 跳出for之后
:: 如果最后一行和倒数第二行内容相等则把最后一行内容放入repetition.txt
:: 最后用for从repetition.txt中逐行读出信息在原文件中把这些信息过滤掉
:: 行首的空格将被忽略空行将不被删除(且不纳入统计数据)
:: 效率惊人地高

:: 不能处理的符号有:
:: 管道符号:|
:: 连接符号:&、&&、||
:: 重定向符号:<、<<、>、>>
:: 转义符号:^
:: 其他字符:"、;、:、\(但是在行首是可以的)

:: 弊端:
:: findstr不能搜索过长的字符串(长度是多少?)

:: Code by JM,Thanks to NaturalJ0
:: build on 2006-9-42006-9-
:: 还要完善或者开发的功能:
:: 对无用的临时文件的处理统计被过滤的行数操作时的提示适应各种文件名cls
title 相同行内容过滤器-处理中...
call :blank
call :blank
echo                          正在处理请耐心等待...
:: 做程序开始时间标记
set time_begin=%time:~0,-3%
for /f "tokens=1,2,3 delims=:" %%i in ("%time_begin%") do (
    set /a hour_b=%%i
    set /a munite_b=%%
    set /a second_b=%%
)

set lines_total=0
set count_same=0
>sort.txt sort<test.txt
cd.>repetition.txt
setlocal enabledelayedexpansion
for /f "tokens=*" %%i in (sort.txt) do (
    set first=!second!
    set second=!third!
    set third=%%i
    set /a lines_total+=1
    call :comp_
)
:: %second%未取到值的时候要避免repetition.txt记录echo的状态
if not "%second%"=="" if "%second%"=="%third%" >>repetition.txt echo %third%&& set /a count_same+=1
:: 没有重复内容则不对原文件作过滤处理
findstr . repetition.txt>nul||(del /q repetition.txt & goto :result)
copy test.txt test.bak>nul
for /f "tokens=*" %%i in (repetition.txt) do (
    findstr /v "\<%%i\>" test.txt>>tmp.txt
    del /q test.txt
    ren tmp.txt test.txt
)
:result
for /f "tokens=*" %%i in (test.txt) do (
    set /a lines_spare+=1
)
if "%lines_spare%"=="" set lines_spare=0
:: 当文本内容超过3行且存在用相同个数的空格为内容的行时
:: repetition.txt会记录echo的状态会导致统计不准确
:: 所以还要用通过比较处理前后行数是否相同来校正统计数据
if "%lines_total%"=="%lines_spare%" (del /q repetition.txt&set count_same=0)
set /a lines_del=%lines_total%-%lines_spare%
cls
title 相同行内容过滤器-过滤结果
call :blank
echo ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
echo                   原文件共有 %lines_total% ;共有 %count_same% 条重复记录.(未计算空行)
echo                   处理后的文件还剩 %lines_spare% .(未计算空行)
echo                   被删除的内容总计 %lines_del% 

rem ======计算花费的时间========
set time_end=%time:~0,-3%
for /f "tokens=1,2,3 delims=:" %%i in ("%time_end%") do (
    set /a hour_e=%%
    set /a munite_e=%%j
    set /a second_e=%%k
)
call :time_lapse
echo                   耗时: %hour_% 小时 %munite_%  %second_% .
echo.
echo                   test.txt为处理后的文件test.bak为原始文件的备份
echo                   sort.txt为原始文件内容的排序文件你可以很方便地
echo               查看文本内容重复与否及重复情况echo                   repetition为重复行的内容升序排列若原始文本没
echo               有重复行则此文件不存在.
echo ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
call :blank
echo                                                                 按任意键退出...
pause>nul
goto :eof

:comp_
:: %second%或者三个变量全都取到空值的时候要避免repetition.txt记录echo的状态
if not "%first%"=="" (
  if not "%second%"=="" (
    if "%second%"=="%first%" (
      if not "%second%"=="%third%" >>repetition.txt echo %second%&& set /a count_same+=1
    )
  )
)
goto :eof

rem =====计算运行程序花费的时间========
:time_lapse
:: 一定要按照 =>分钟=>小时 的顺序操作
if %second_e% lss %second_b% (
    set /a munite_e=%munite_e%-1
    set /a second_e=%second_e%+60
)
set /a second_=%second_e%-%second_b%
if %munite_e% lss %munite_b% (
    set /a hour_e=%hour_e%-1
    set /a munite_e=%munite_e%+60
)
set /a munite_=%munite_e%-%munite_b%
if %hour_e% lss %hour_b% (
    set /a hour_e=%hour_e%+24
)
set /a hour_=%hour_e%-%hour_b%
goto :eof

:blank
echo.
echo.
echo.
echo.
goto :eof

第一次用这个代码插件,不知道能不能完好的支持

第三种方法,使用强大的文本编辑器vi,windows下面下载 gvim ,安装后运行gVim软件(不是easy版,不是read only版,而是有打开保存按钮功能的那个),打开需要编辑的文本文件,什么都不要动,输入

%!sort

然后按回车,然后保存,处理结束

 

这样,三种去除文本文件中重复的行的方法说完了,大家用到的时候试试吧

蜘蛛抓手  txt 去除重复的行    文本重复去除器

赞(0)
未经允许不得转载:RUBLOG-分享我的生活 » 教你怎么去除文本文件中重复的行

我想说 3

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #-49

    linux不会,windows下可好办,用editplus就可以直接取出重复行。

    tiao589年前 (2011-04-29)Reply
    • linux也挺好办的,gvim 也挺好

      xinyu2ru9年前 (2011-04-30)Reply