[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【出题】批处理去除超大文本中的重复行

去除超大文本中的重复行
在非常批处理论坛看到这个题,觉得挺有挑战的,上百万行的数据,光靠批处理应该是难做到了,不知道借助第三方命令行工具能否完成。

文本内有大概100W行的数据
要求一、 删除所有重复行
要求二、 以----为分隔符,将第一列与第二列重复的行删除(描述有问题,以末尾的红色字更新为准)
两个要求完成一个也行,分两个代码完成也行,最完美的是在一个代码中完成两个要求。

部分样本
12779----alibaba140379----222.222.222.222----哈哈哈哈哈哈----2008-5-20----21:24:20
13166----BXGHgxst115----123.112.68.25----欧洲
12779----alibaba140379----203.93.208.138----山东省青岛市网通----2008-5-20----21:24:20
13166----BXGHgxst115----111.111.111.111
12779----alibaba140379----222.222.222.222----哈哈哈哈哈哈----2008-5-20----21:24:20
255004----dsfdsfdsf----123.112.77.25


扩展要求:保持原文本中不重复的行顺序不变

创建 100万 行左右的测试文件代码。
。。。
  1. @echo off&setlocal enabledelayedexpansion
  2. echo 正在创建测试文件 y1.txt 请稍候。。。 行数为 1000005 行
  3. (for /l %%a in (1 1 100) do echo !random!----!random!----!random!!random!----!random!)>y1.txt
  4. (for /l %%a in (1 1 10) do type y1.txt)>y2.txt
  5. (for /l %%a in (1 1 10) do type y2.txt)>y1.txt
  6. (for /l %%a in (1 1 10) do type y1.txt)>y2.txt
  7. (for /l %%a in (1 1 10) do type y2.txt)>y1.txt
  8. (echo !random!----!random!----!random!!random!----!random!!random!
  9. echo !random!----!random!----!random!!random!----!random!!random!
  10. echo !random!----!random!----!random!!random!----!random!!random!
  11. echo !random!----!random!----!random!!random!----!random!!random!
  12. echo !random!----!random!----!random!!random!----!random!!random!)>>y1.txt
  13. del /q y2.txt
复制代码
问题二描述有问题,现更新
要求二、 以----为分隔符,将第一列与第二列重复的行删除,保留第一行。
比如:
1234---555--44444444444
1234---7777--fafjaf
1234---555--444444
334----7898----dfadifaf
1234---555--00000000000000
这种情况下就保留第1、2、4行
因为第1行、第3行、第5行,的第1列和第2列是重复的。


[ 本帖最后由 随风 于 2009-5-29 17:59 编辑 ]
技术问题请到论坛发帖求助!

就算写出来了 执行 也要卡死
可以用linux命令

TOP

回复 2楼 的帖子

就是要看能否突破这个效率问题啊^_^
技术问题请到论坛发帖求助!

TOP

可能不是每个人都知道如何快速生成100W行测试文本,楼主在顶楼给个例子吧。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

已在顶楼给出创建测试文件代码
技术问题请到论坛发帖求助!

TOP

处理6W行记录花了2分多钟,100W就不敢试了!大概要一个多小时吧!
源文件为:sour2.txt
处理结果为:temp3.txt
可完成两个要求。
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in (sour2.txt) do (
  3.         set/a n+=1
  4.         set num=000000!n!
  5.         echo !num:~-7!-%%a
  6. ))>temp.txt
  7. ::加入序号保持原来的顺序
  8. (for /f "tokens=1,2,3* delims=-" %%a in ('sort temp.txt /+8') do (
  9.         if "%%b-%%c" neq "!var!" (echo %%a-%%b-%%c-%%d)
  10.         set var=%%b-%%c
  11. ))>temp2.txt
  12. ::从第8位开始排序,即只按原来的数据排序,重复的丢弃
  13. (for /f "tokens=1,2,3* delims=-" %%a in ('sort temp2.txt') do (
  14. echo %%b----%%c----%%d
  15. ))>temp3.txt
  16. ::恢复原来的顺序,并丢弃加入的临时序号
复制代码
把楼主的数据存为sour.txt, 通过下面代码生成的sour2.txt具有6W行记录。
  1. @echo off
  2. (for /f "delims=" %%a in (sour.txt) do (
  3. for /l %%b in (1,1,10000) do (echo %%a)
  4. ))>sour2.txt
复制代码

[ 本帖最后由 netbenton 于 2009-5-29 17:51 编辑 ]

TOP

问题二描述有问题,现更新
技术问题请到论坛发帖求助!

TOP

C:\Test>test.bat
0 小时 0 分钟 1 秒 51 毫秒

C:\Test>type test.bat
@echo off
set begin=%time%
gawk "!a[$0]++" y3.txt>>a.txt
call :time0 %begin% %time% duration
echo %duration%
goto :eof

:time0
::计算时间差(封装)
@echo off&setlocal&set /a n=0&rem code 随风 @bbs.bathome.net
for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100)
set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
endlocal&set %~3=%ok:-=%&goto :EOF
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

此方法应该可以的

@echo off
for /f %%i in (test.txt) do md %%i
dir/ad/b/o:n>Kiming.txt
for /f %%i in ('dir /b /ad') do rd %%i
是将里面的内容建立成目录 然后提取目录名 在写入新的txt
这个方法速度很快的哦
此方法思路源于 http://www.heycoffee.com/article/SoftwareWorks/320.htm

TOP

好恐怖的方法^_^
上百万行,你要创建多少个目录?况且如果文本内容含文件名不允许的字符怎办?
技术问题请到论坛发帖求助!

TOP

大哥 md创建 很快的瞬间就好了的 不试试看怎么知道了
你给的那个100w行的代码有问题啊 就几个重复的
N多不重复的
至于那个非法字符用word搞下就可以了
好像里面没非法字符啊

[ 本帖最后由 Kiming 于 2009-5-29 19:54 编辑 ]

TOP

re 11 楼
你确定 那个100w行的代码有问题啊 就几个重复的 ?
技术问题请到论坛发帖求助!

TOP

回LS的

我用了别人的代码测试了 发现只有 几行 所以我才认为有问题 实际上没问题
错怪了LZ了啊 对不起-_-!

TOP

LZ我的代码我用了4分钟就解决了
本人亲自 测试 4分钟OK了 还算比较快吧
【只有相信成功,自己才会成功】

TOP

回复 14楼 的帖子

首先 4分钟 并不算快,
况且顶楼的只是临时测试样本,而非正在的需处理原件,为提高创建样本时间而产生的行大多是重复的,其实不重复的应该只有百来行,这使得你第二个for的运行时间大大减少,若不重复行占半数或更多呢?
其次,还是非法文件名问题,若在word中进行替换则使得代码变成了半自动,不够完美。
再次,创建这么多的临时文件,个人认为始终不太可取,如此疯狂的对硬盘进行写入操作不知道对硬盘会否有影响。
技术问题请到论坛发帖求助!

TOP

返回列表