中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [出题]在不包含重复行的大文件中快速提取指定数量的行
作者:
标题: [出题]在不包含重复行的大文件中快速提取指定数量的行 上一主题 | 下一主题
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『楼 主』:  [出题]在不包含重复行的大文件中快速提取指定数量的行

假设文本文件a.txt包含5万行互不重复的内容(不考虑特殊字符)
请用纯批处理以最快的速度提取前49990行
输出到b.txt

为了便于比较各种方案所需要的时间,我们以下面的代码产生的文本为评判标准(但实际上行与行之间的内容没有任何规律可循):
@echo off
>a.txt type nul
for /l %%a in (1,1,50000) do (
  >>a.txt echo 中国DOS联盟批处理室测试数据%%a
)




2008-11-22 02:29
查看资料  发短消息 网志   编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 2 楼』:  

一觉醒来,先凑个数(基本都会的)
@echo off &setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
set /a n+=1
if !n! equ 49991 (exit /b 0)
>>b.txt echo %%i
)


   此帖被 +2 点积分    点击查看详情   
评分人:【 HAT 分数: +2  时间:2008-11-22 07:15


2008-11-22 05:15
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 3 楼』:  Re 2楼

这个方法确实比较容易想到
不过还有更快的方法:)



2008-11-22 07:15
查看资料  发短消息 网志   编辑帖子  回复  引用回复
kissbill
初级用户





积分 61
发帖 35
注册 2008-10-4
状态 离线
『第 4 楼』:  

5万行啊,不知道比沙发的快不
@echo off
more +49990 1.txt>2.txt
echo.>>1.txt
findstr /bevig:2.txt 1.txt>3.txt
pause
[ Last edited by kissbill on 2008-11-22 at 09:52 ]

   此帖被 +9 点积分       点击查看详情   
评分人:【 moniuming 分数: +9  时间:2008-11-23 12:09


2008-11-22 09:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 5 楼』:  执行速度



  Quote:
C:\>timeit -s 2#if.bat

Version Number:   Windows NT 5.1 (Build 2600)
Exit Time:        10:35 pm, Friday, November 21 2008
Elapsed Time:     0:00:28.484
Process Time:     0:00:21.453

C:\>timeit -s 4#findstr.bat

Version Number:   Windows NT 5.1 (Build 2600)
Exit Time:        10:36 pm, Friday, November 21 2008
Elapsed Time:     0:00:04.093
Process Time:     0:00:00.046

(p.s.,纯批处理允许内部工具吗?)

2008-11-22 11:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Saber
初级用户





积分 26
发帖 14
注册 2008-7-6
状态 离线
『第 6 楼』:  

用自己写的程序的话算“作弊”了吧……

2008-11-22 11:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
kissbill
初级用户





积分 61
发帖 35
注册 2008-10-4
状态 离线
『第 7 楼』:  

timeit 自己的工具?

2008-11-22 11:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 8 楼』:  Re 5楼

tireless 兄的代码为何不贴出来?



2008-11-22 12:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by HAT at 2008-11-22 12:51 PM:
tireless 兄的代码为何不贴出来?

我也只想到2楼和4楼的方法。5 楼贴出的数据是2楼和4楼的代码执行速度。

2008-11-22 12:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Saber
初级用户





积分 26
发帖 14
注册 2008-7-6
状态 离线
『第 10 楼』:  


@ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION
Set/A N=1
FOR /F "skip=49990" %%i IN (a.txt) DO (
        Set String!N!=%%i
        Set/A N+=1
)
Set/A N-=1
Set Command=FindStr /VC:!String%N%! a.txt
Set/A N-=1
FOR /L %%i IN (!N! -1 1) DO Set Command=!Command!^|FindStr /VC:!String%%i!
Cmd/C !Command!>output.txt
Output.txt
Del Output.txt
[ Last edited by Saber on 2008-11-22 at 16:12 ]

   此帖被 +9 点积分       点击查看详情   
评分人:【 moniuming 分数: +9  时间:2008-11-23 12:14


2008-11-22 14:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 11 楼』:  不知道这样速度怎样

@echo off
(for /f "delims=:" %%a in ('findstr /n .* a.txt') do if %%a leq 49990 (echo.%%b) else (goto :quit))>b.txt
:quit

[ Last edited by netbenton on 2009-2-27 at 07:22 ]



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-2-25 23:37
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: