Board logo

标题: 【练习-036】批处理将数值按要求排序 [打印本页]

作者: batman    时间: 2009-2-25 20:25     标题: 【练习-036】批处理将数值按要求排序

出题目的:
  1、通过练习掌握数值排序的几种方法
  2、通过练习掌握切分字符串的方法
加分原则:
  满分15分,视情形加分(以思路为重)
解题限制:
  版主级的暂请观看,但可做解题提示
题目如下:
  有a.txt(见一)内容为N列N行不等的4位内数值,通过批处理将所有数值从小到大进行排序,并按6个数值一行输出到b.txt(见二)。

  1. 4981 5487 2724 2419 4837 2218 37 19 2880 5521
  2. 9613 7292 7433 554 8287 1147 9516 5678 9760 3028
  3. 9220 5936 3580 6455 8116 9776 6246 1652 6390 6615
  4. 7855 7707 1850 4564 2454 4571 7330 8718 4499 5083
  5. 7683 3076 637 3644 9714 6080 9554 8250 5353 6692
  6. 4036 9590 4539 8156 7648 6738 8834 7033 4043 9729
  7. 7512 1299 1611 1054 9291 9948 7213 5882 6891 6149
  8. 1159 7604 1290 7426 8342 4907 7802 2285 6828 4547
  9. 940 4594 5470 3831 7949 3308 8553 5841 4532 6151
  10. 2048 4362 7137 6227 1843 2833 119 6124 6716 4435
  11. 6342 132 4637 4359 7482 632 8 35 9999 1023
复制代码


  1. 8 19 35 37 119 132
  2. 554 632 637 940 1023 1054
  3. 1147 1159 1290 1299 1611 1652
  4. 1843 1850 2048 2218 2285 2419
  5. 2454 2724 2833 2880 3028 3076
  6. 3308 3580 3644 3831 4036 4043
  7. 4359 4362 4435 4499 4532 4539
  8. 4547 4564 4571 4594 4637 4837
  9. 4907 4981 5083 5353 5470 5487
  10. 5521 5678 5841 5882 5936 6080
  11. 6124 6149 6151 6227 6246 6342
  12. 6390 6455 6615 6692 6716 6738
  13. 6828 6891 7033 7137 7213 7292
  14. 7330 7426 7433 7482 7512 7604
  15. 7648 7683 7707 7802 7855 7949
  16. 8116 8156 8250 8287 8342 8553
  17. 8718 8834 9220 9291 9516 9554
  18. 9590 9613 9714 9729 9760 9776
  19. 9948 9999
复制代码

[ 本帖最后由 batman 于 2009-2-25 20:31 编辑 ]
作者: BBCC    时间: 2009-2-25 21:37

嗯..数据.数量很大的时候用什么方法好呢?二分法应该是比较快的了,但是不知道速度能不能跟上...
作者: zhouyongjun    时间: 2009-2-25 22:21

周哥,我目前只想到这个简单且效率不高的方法。
  1. @echo off
  2. for /f "tokens=1-10" %%a in (a.txt) do (
  3. set/a _%%a=0,_%%b=0,_%%c=0,_%%d=0,_%%e=0,_%%f=0,_%%g=0,_%%h=0,_%%i=0,_%%j=0
  4. )
  5. for /l %%i in (1,1,9999) do (
  6. if defined _%%i call :output %%i
  7. )
  8. exit
  9. :output
  10. <nul set/p=%1 >>b.txt
  11. set/a n+=1
  12. if %n% equ 6 echo.>>b.txt&set/a n=0
  13. goto :eof
复制代码

作者: batman    时间: 2009-2-25 23:03

请注意a.txt是n列n行,就是不知道有几行几列,所以楼上的tokens=1-10不可取,同时这种代码的效率是很相当低的。
作者: batman    时间: 2009-2-25 23:54

原帖由 BBCC 于 2009-2-25 21:37 发表
嗯..数据.数量很大的时候用什么方法好呢?二分法应该是比较快的了,但是不知道速度能不能跟上...

兄弟把你的方法写出来看看吧
作者: batman    时间: 2009-2-26 10:07

我想知道三个答案:
一、是不是我每次出的题都难了点,让大家习惯性的望而生畏了?
二、是不是大家都不想通过解题这种快捷方式来得到提高了?
三、难道论坛除了版主、技术组、新手(新手在做新手题)就没有其他的会员了?
作者: shqf    时间: 2009-2-26 12:52

  1. @echo off&setlocal enabledelayedexpansion
  2. >b.txt cd.
  3. for /f "usebackq delims=" %%i in (`more a.txt`) do (set "numbers_old=!numbers_old! %%i")
  4. for %%i in (%numbers_old%) do (
  5.   set number=0000%%i
  6.   set number=!number:~-4!
  7.   set _!number!=%%i
  8. )
  9. for /f "tokens=2 delims==" %%i in ('set _') do (
  10.   for %%j in (%%i) do set "numbers_new=!numbers_new! %%j"
  11. )
  12. for %%i in (%numbers_new%) do (
  13.   set /p=%%i <nul >>b.txt
  14.   set /a n+=1
  15.   if !n! equ 6 echo.>>b.txt&set /a n=0
  16. )
  17. start b.txt
  18. exit
复制代码
说明一下:为此题学习了随风的排序函数,也终于搞懂了这个函数。学习了他的思路,不要分数,凑个热闹、搞点人气而已。

[ 本帖最后由 shqf 于 2009-2-26 12:57 编辑 ]
作者: BBCC    时间: 2009-2-26 12:56

原帖由 batman 于 2009-2-26 10:07 发表 [img][/img]
我想知道三个答案:
一、是不是我每次出的题都难了点,让大家习惯性的望而生畏了?
二、是不是大家都不想通过解题这种快捷方式来得到提高了?
三、难道论坛除了版主、技术组、新手(新手在做新手题)就没有其他的 ...

人家要上学嘛...看这个周末有时间不...

不过也是要号召更多人来做这种题啊...
作者: namejm    时间: 2009-2-26 13:24

  如果原始数据中没有重复的数值,并且数值的位数是已知的,那么,可以考虑用 for /l 生成从1~N的递增序列,每生成一个数值,就用 findstr 在原始表中查询数据,我觉得这应该是最简洁最高效的办法。

  当然,如何用 findstr 来精确匹配每一列数值,还得想办法对原始数据做一番处理。至于需要如何处理,各位开动脑筋想一想吧^_^。
作者: batman    时间: 2009-2-26 15:30

我不赞同jm的意见,首先我声明了原始数据中数值是不等的(这在题目中可以看到),其次
采用for /l (1,1,n)+findstr的方法效率不是最高的,举个例子假如原始数据中只有
1,1000,1000000000这三个数据,那岂不是for要空循环1000000000-3次,我觉得设置变量
法是最快的,以上面的例子只要设置三个变量就行了,至于具体怎么处理,大家思考了。
作者: namejm    时间: 2009-2-26 16:27

  我认为,对于排序的问题,并没有一个谁快谁慢的绝对方案,要具体问题具体分析。

  如果数据十分少,且范围十分大,用 for /l + findstr 的方法无疑是很浪费的做法。

  如果是大量的数据,并且数据范围很窄,那么, for /l + findstr 应该是比较有优势的,因为用 for /l 罗列数字序列的速度非常快,可以免去数值大小的比较这一步,比较耗时的操作都是花费在频繁地调用findstr来打开文本文件上面,这使得 for /l + findstr 方案的效率骤然降低;在这种情况下,我觉得如果换用其他的方案,还需要先正确提取每一个数值,然后遍历表中的数据,对取到的每一个数值在表中做一番比较,处理次数将呈几何级增长,即使通过优化算法,数值比较的次数仍然十分可观,比较保守的估计,比较次数应该不低于1+2+3+……+N 次(N为数字个数),再加上批处理中没有数组的设计,保存那些临时数据也是件麻烦的事情,综合起来考虑,我并不觉得其他的方法比 for /l + findstr 好到哪里去。当然,限于本人的学识,对排序算法粗通皮毛,不知道是否有更高效的算法存在。

  声明:以上言论未经实测验证,仅为本人的推理,正确与否,以实际测试结果为准。
作者: shqf    时间: 2009-2-26 16:33

  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. >1.txt cd.&>b.txt cd.
  4. for /f "usebackq delims=" %%i in (`more a.txt`) do (
  5.   for %%j in (%%i)do (
  6.     set "number=   %%j"
  7.     echo !number:~-4!>>1.txt
  8.   )
  9. )
  10. for /f "usebackq" %%i in (`sort 1.txt`) do (
  11.   set /p=%%i <nul >>b.txt
  12.   set /a n+=1
  13.   if !n! equ 6 echo.>>b.txt&set /a n=0
  14. )
  15. start b.txt
  16. del 1.txt
  17. exit
复制代码
哈,我再来一个。这样的题蛮有意思。
作者: zqz0012005    时间: 2009-2-26 16:36     标题: 回复 7楼 的帖子

用不着临时文件。
在for的in里面用('set _^|sor')t就可以排序。

话说我第一反应就是把数字作为变量名的一部分来存储。
作者: terse    时间: 2009-2-26 16:42

我的思路  SET  后  FOR
作者: namejm    时间: 2009-2-26 16:46

  如果是 set 后再 for ,对付少量的数据确实是个很高效的算法;若楼主的意图是处理海量数据,那么,大量的变量将会撑满内存,好像场面壮观了点^_^。
作者: namejm    时间: 2009-2-26 17:10

  做这个题目的时候,又想起了以前在其他论坛曾经帮别人解答过类似的题目,有位网友给出了一段十分经典的代码,用的是 for /l + findstr正则+sort 方案,只需要设置两个变量即可搞定,处理海量数据的速度只能用震惊来形容,处理顶楼的数据,排序部分花了不到两秒钟(机器配置:主频1.6G、内存512M、操作系统XP_SP3)。呵呵,先卖个关子,请大家继续。

  用顶楼的数据来测试我那个 for /l + findstr 的猜想,等了快10分钟都还没得到最终结果,看来cmd.exe对频繁调用某些命令可能有一些抑制机制,以防非正常的调用导致系统崩溃——当然,这只是我的一个猜想,各位可以当做是我在为自己可耻的失败寻找冠冕堂皇的理由^_^。
作者: terse    时间: 2009-2-26 17:36

12楼的临时文件可省略
后面sort也可弃去 直接SET ..等同了
JM版的FINDSTR  总觉得是整行获取  那不是后面还要很多工作

[ 本帖最后由 terse 于 2009-2-26 17:38 编辑 ]
作者: zqz0012005    时间: 2009-2-26 17:41

set再for
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. cd.>b.txt
  4. for /f "delims=" %%a in ('type a.txt') do for %%i in (%%a) do set number=____%%i&set !number:~-5!=1
  5. for /f "delims=_=" %%i in ('set _^|sort') do (
  6.   set var=!var! %%i
  7.   set /a n+=1
  8.   set /a "i=1/(n/6)" 2>nul && (>>b.txt echo !var!&set var=&set n=)
  9. )
  10. (echo !var!)>>b.txt%不足6个数的部分%
  11. start b.txt
复制代码

作者: zqz0012005    时间: 2009-2-26 17:45

for /l + findstr (有临时文件)
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. cd.>b.txt
  4. (for /f "delims=" %%a in ('type a.txt') do for %%i in (%%a) do echo %%i)>~a.txt
  5. (for /l %%a in (1 1 9999) do echo %%a)>~t.txt
  6. for /f %%a in ('findstr /rxg:~a.txt t.txt') do (
  7.   set var=!var! %%a
  8.   set /a n+=1
  9.   if !n!==6 (>>b.txt echo !var!&set var=&set n=)
  10. )
  11. (echo !var!)>>b.txt%不足6个数的部分%
  12. del ~a.txt ~t.txt
  13. start b.txt
复制代码

作者: namejm    时间: 2009-2-26 18:06

  for /l+findstr+sort 方案需要生成临时文件,临时文件是一行一条数据,然后想办法sort,需要用findstr的正则来控制要提取的数字的位数,如何控制参与sort的数字的位数是这个方案的关键,暂时就提示那么多,看看有没有人能写出成形的代码。

  呵呵,貌似这个题目弄成挑战赛了。
作者: terse    时间: 2009-2-26 18:58

用临时文件的话 我直接TYPE
FINDSTR 控制位数的话 好象用.的话的通配了  再想想
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "usebackq tokens=*" %%i in ("n.txt") do (
  3.     for %%j in (%%i) do (
  4.         set "str=   %%j"
  5.         echo !str:~-4!
  6. )))>tem
  7. for /f "tokens=*" %%i in ('sort tem') do (
  8.   set/a n+=1,n%%=6
  9.   if !n! equ 0 (echo !var:~1! %%i&set "var=")else set var=!var! %%i
  10. )
  11. if not "!var!"=="" echo !var:~1!
  12. pause
复制代码

[ 本帖最后由 terse 于 2009-2-26 21:04 编辑 ]
作者: 随风    时间: 2009-2-26 19:17

海量数据用临时文件加findstr
少量数据用变量
我只能想到这样了。。

[ 本帖最后由 随风 于 2009-2-26 19:26 编辑 ]
作者: terse    时间: 2009-2-26 19:25

我最多就这思路了  貌似比上面麻烦  继续看看
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "usebackq tokens=*" %%i in ("n.txt") do (
  3.     for %%j in (%%i) do echo %%j
  4. ))>tem
  5. for /l %%i in (1 1 4) do (
  6. if "!t!"=="" (set t=[0-9])else set t=[0-9]!t!
  7. for /f %%i in ('findstr "\<!t!\>" tem^|sort') do (
  8.     set/a n+=1,n%%=6
  9.     if !n! equ 0 (echo !var:~1! %%i&set "var=")else set var=!var! %%i
  10. )
  11. )
  12. if not "!var!"=="" echo !var:~1!
  13. pause
复制代码

作者: wxcute    时间: 2009-2-26 19:56

set 变量法补 0 时也可以用其他符号如 +、# 或 $ 等。

总的想法与楼主一样,也是先 SET 变量(用来排序)再 FOR(用来输出)。
作者: namejm    时间: 2009-2-26 20:15

  terse在17楼的代码思路也非常不错,如果第二条for语句不使用type语句而直接sort的话,效率还可以稍有提升。

  23楼的思路正是我提到的 for /l+findstr+sort 方案,与17楼的方案比起来,在速度上差远了。

  就目前情况而言,17楼的方案应该是最通用、也是效率最高的了。
作者: 随风    时间: 2009-2-26 20:31     标题: 回复 21楼 的帖子

'type tem^|sort' 为何不写成  sort tem
作者: terse    时间: 2009-2-26 21:03

原帖由 随风 于 2009-2-26 20:31 发表
'type tem^|sort' 为何不写成  sort tem

这就改  谢
作者: 随风    时间: 2009-2-26 21:20

忍不住,也发两个凑凑热闹。
代码一、
不生成临时文件,适合处理少量数据。可以处理重复数字。
  1. @echo off
  2. if "%~1"=="" (
  3.   setlocal enabledelayedexpansion&set /a n=0
  4.   for /f "tokens=* delims=0" %%a in ('%~s0 h^|sort') do (
  5.      set /a n+=1,n=n%%6
  6.      set /p=%%a <nul
  7. if !n! equ 0 echo.
  8.    )
  9.   pause&exit
  10. )
  11. setlocal enabledelayedexpansion
  12. for /f "usebackq tokens=*" %%i in ("a.txt") do (
  13.    for %%j in (%%i) do set m=0000000000%%j&echo !m:~-10!
  14. )
  15. endlocal
  16. goto :EOF
复制代码
代码二、
需确定最高位是多少。
生成一个临时文件也可以,不过既然已经生成了临时文件,不防再多生成一个以提高效率。
因为 for /f + findstr 效率很低。
适合处理海量数据。
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "usebackq tokens=*" %%i in ("a.txt") do (
  3.     for %%j in (%%i) do echo %%j
  4. ))>tem
  5. sort tem>tem2
  6. cd.>tem
  7. for /l %%a in (1 1 4) do (
  8.    set num=.!num!
  9.    findstr /x !num! tem2>>tem
  10. )
  11. for /f "delims=" %%a in (tem) do (
  12.      set /a n+=1,n=n%%6
  13.      set /p=%%a <nul
  14. if !n! equ 0 echo.
  15. )
  16. echo.&pause
复制代码

作者: Batcher    时间: 2009-2-26 23:17     标题: 为23楼加点注释以便初学者阅读

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. ::把原始数据转换成每行只有一个数字的形式
  4. (for /f "usebackq tokens=*" %%i in ("a.txt") do (
  5.   for %%j in (%%i) do (
  6.     echo %%j
  7.   )
  8. ))>tem
  9. ::分别对一位、二位、三位、四位数字进行sort排序
  10. ::这样的做的原因是sort排序时是按照字符ASCII逐位比较的
  11. for /l %%i in (1 1 4) do (
  12.   if "!t!"=="" (
  13.     ::定义这样的变量是为了在后面的findstr正则表达式中匹配任意一位0到9之间的数字
  14.     set t=[0-9]
  15.   ) else (
  16.     ::在后面的findstr正则表达式中分别匹配二位、三位、四位数字
  17.     set t=[0-9]!t!
  18.   )
  19.   ::控制参与sort排序的数字位数
  20.   ::在findstr正则表达式中<string>表示精确匹配
  21.   ::结合外层for循环实现分别对一位、二位、三位、四位数字进行sort排序
  22.   for /f %%i in ('findstr "\<!t!\>" tem^|sort') do (
  23.     set /a n+=1
  24.     ::对6取余是实现六列一行的关键
  25.     set /a n%%=6
  26.     if !n! equ 0 (
  27.       echo !var:~1! %%i
  28.       set "var="
  29.     ) else (
  30.       set var=!var! %%i
  31.     )
  32.   )
  33. )
  34. if not "!var!"=="" (
  35.   echo !var:~1!
  36. )
复制代码

作者: Batcher    时间: 2009-2-26 23:24     标题: 为21楼加点注释以便初学者阅读

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. ::把原始数据转换成每行只有一个数字的形式
  4. (for /f "usebackq tokens=*" %%i in ("a.txt") do (
  5.   for %%j in (%%i) do (
  6.     ::在每个数字的最左侧补上三个空格
  7.     set "str=   %%j"
  8.     ::截取补空格以后的字符串的最右侧四位
  9.     ::最终的结果就是把所有数字全部补成四个字符(不足四位的在左侧补空格)
  10.     ::这样的做的原因是sort排序时是按照字符ASCII逐位比较的
  11.     echo !str:~-4!
  12.   )
  13. ))>"%temp%\GridNum.txt"
  14. ::利用tokens=*忽略行首空格的特性来删除前面补的空格
  15. for /f "tokens=*" %%i in ('sort "%temp%\GridNum.txt"') do (
  16.   set /a n+=1
  17.   ::对6取余是实现六列一行的关键
  18.   set /a n%%=6
  19.   if !n! equ 0 (
  20.     echo !var:~1! %%i
  21.     set "var="
  22.   ) else (
  23.     set var=!var! %%i
  24.   )
  25. )
  26. if not "!var!"=="" (
  27.   echo !var:~1!
  28. )
复制代码

作者: zqz0012005    时间: 2009-2-27 08:37     标题: 回复 28楼 的帖子

因为 for /f + findstr 效率很低。

你说的是把findstr嵌在in里面吗?理论上效率应该不会很低吧。
应该与先将findstr的结果保存到文件,再for /f 解析文件差不多。findstr的效率不低。要实现六列一行,用for /f是必不可少的。

====================================
是在 for /f 的 in 中命令的运行方式(cmd /c command)影响效率吗?
因为要额外启动一个CMD,所以速度要慢一点。但应该不影响解析效率吧。
照这样说,所有用 for /f 解析命令输出的方法都对速度有一定影响,也就是增加了总的运行时间,折算起来就相当于降低了效率。


PS:19楼代码中 findstr /rxg:~a.txt t.txt,t.txt前面写掉了~。

[ 本帖最后由 zqz0012005 于 2009-2-27 08:49 编辑 ]
作者: batman    时间: 2009-2-27 13:19

&&没想到这个贴子引发了众位管理员对处理数据的一番激烈议论,各位也给出了精彩的代
码,看得我目不暇接眼花缭乱,确实是学习了。
  对于数据的处理,本人还是偏爱于设置变量法,jm说这种方法会消耗系统内存,确实是
如此,经本人亲自实验,按现在的一般机器配置,设置1000000个变量(仅实验到百万)对
系统的运行不会造成明显的影响。因此,设置变量法还是合适处理海量的数据的。
  下面给出本人的解:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.     for %%b in (%%a) do set "a=####%%b"&set "_!a:~-4!=a"
  4. )
  5. for /f "tokens=1 delims=#_=" %%a in ('set _') do (
  6.      set /a n+=1,m=n%%6
  7.      set /p=%%a        <nul>>b.txt
  8.      if !m! equ 0 echo.>>b.txt
  9. )
  10. start b.txt
复制代码
  
作者: 随风    时间: 2009-3-2 19:01     标题: 回复 31楼 的帖子

for /f + findstr 效率很低。
应该与先将findstr的结果保存到文件,再for /f 解析文件差不多。
理论上好像是这样的,但事实不是。
findstr 无论是遍历、还是写入文件,速度都是超快的,但如果把findstr运行的结果
直接赋值给for就没有充分利用findstr命令的优势了。
事实上 for 的in 中嵌套任何命令都是影响效率的,
比如我们常用的
for /f "delims=" %%a in ('dir/b') do ......
for /f "delims=" %%a in ('set .') do ......
等等,只是在少量的数据、或少量的使用次数面前体现不出来。
废话少说,测试以下代码,应该会有所发现。
a.txt 内容至少 5万行
代码一、
  1. for /f "delims=" %%a in ('findstr .* a.txt') do echo %%a
复制代码
代码二、
  1. findstr .* a.txt>b.txt
  2. for /f "delims=" %%a in (b.txt) do echo %%a
复制代码
回复 32 楼 楼主
设置变量的方法确实好,不过有一个缺点是无法处理重复的数字
在实际应用中,对大量的数字排序,不重复的数字应该不多吧。。^_^
作者: zhouyongjun    时间: 2009-3-3 12:02

回楼上随风兄,我试了这样修改下能处理重复,不知通用么。
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('more a.txt') do (
  3. for %%j in (%%i) do (
  4. set "num=0000%%j"&set "num=!num:~-4!"
  5. if defined _!num! (set/a m+=1&set _!num!!m!=%%j
  6. ) else set _!num!=%%j
  7. ))
  8. for /f "tokens=2 delims==" %%i in ('set _') do (
  9. <nul set/p=%%i >>b.txt
  10. set/a n+=1
  11. if !n! equ 6 echo.>>b.txt&set/a n=0
  12. )
  13. start "" "b.txt"
复制代码

[ 本帖最后由 zhouyongjun 于 2009-3-3 12:11 编辑 ]
作者: netbenton    时间: 2009-5-1 19:46     标题: 我也练练手

@echo off&setlocal enabledelayedexpansion
(set m=
for /f "delims=" %%a in (a.txt) do (
    for %%b in (%%a) do (
        set "one=0000%%j"&set/a m+=1&set _!num:~-4!_!m!=%%j
)  )
set n=6&set str=
for /f "tokens=2 delims==" %%i in ('set _') do (
    set str=!str! !%%i
    set/a n-=1,1/n||(set n=6&echo !str!&set str=)
)
if defined str echo !str!)>b.txt
start "b.txt"
作者: everest79    时间: 2009-5-2 03:04

使用debug
  1. @echo off
  2. Setlocal EnableDelayedExpansion
  3. Set fs=1.txt
  4. Set dt=2.txt
  5. Set tf=db-tmp.txt
  6. Set lenb=1
  7. Set "o=>>%tf%"
  8. call :sizehex %fs%
  9. call :consoledb %fs%
  10. ::scan file1
  11. %o% echo s 100 %size% 20
  12. %o% echo q
  13. start /w debug ^<%tf% ^>db-out.txt
  14. ::edit file1
  15. call :consoledb %fs%
  16. for /f "eol=- tokens=2 delims=:" %%a in (db-out.txt) do (
  17. if defined old (
  18. set /a len=0x%%a-old-1
  19. set /a old=0x%%a
  20. if !len! GTR !lenb! Set /a lenb=len
  21. ) else (
  22. set /a old=0x%%a
  23. )
  24. %o% echo e %%a
  25. %o% echo 0A
  26. )
  27. %o% echo w
  28. %o% echo q
  29. start /w debug ^<%tf%
  30. ::output
  31. call :fined >%dt%
  32. call :sizehex %dt%
  33. call :consoledb %dt%
  34. ::scan file2
  35. %o% echo s 100 %size% 0D
  36. %o% echo q
  37. start /w debug ^<%tf% ^>db-out.txt
  38. ::edit file2
  39. call :consoledb %dt%
  40. for /f "eol=- tokens=2 delims=:" %%a in (db-out.txt) do (
  41. set /a count+=1,line=count%%6
  42. if !line! NEQ 0 (
  43. %o% echo e %%a
  44. %o% echo 20 20
  45. )
  46. )
  47. %o% echo w
  48. %o% echo q
  49. start /w debug ^<%tf%
  50. pause
  51. del db-???.txt
  52. goto :eof
  53. :fined
  54. set reg=%reg%[0-9]
  55. if %lenb% EQU 0 goto :eof
  56. set /a lenb-=1
  57. more %fs%|findstr /b /e %reg%|sort
  58. call :fined
  59. goto :eof
  60. :consoledb
  61. >%tf% cd.
  62. %o% echo n%1
  63. %o% echo l
  64. goto :eof
  65. :sizehex
  66. set /a size=%~z1/16*10
  67. goto :eof
复制代码

作者: netbenton    时间: 2009-5-2 07:31

要是用debug的话,就就应用汇编批令完成了,搞那么多次debug调用,效率太低了一点
作者: everest79    时间: 2009-5-2 07:53

原帖由 netbenton 于 2009-5-2 07:31 发表
要是用debug的话,就就应用汇编批令完成了,搞那么多次debug调用,效率太低了一点

那个我不懂嘿嘿
作者: keen    时间: 2009-6-5 16:39

来个效率低下的:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1 1 10000) do (
  3.     for /f "delims=" %%b in (a.txt) do (
  4.         for %%c in (%%b) do (
  5.             if %%a equ %%c set /p= %%a<nul&set /a n+=1&if !n! equ 6 echo\&set n=0
  6. )))
  7. pause
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2