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

我也贴个

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('type 1.txt') do set /a a+=1
  4. for /f "delims=" %%a in ('type 2.txt') do set /a b+=1
  5. set /a t1+=!a!-!b!
  6. set /a t2+=!b!-!a!
  7. for /f "delims=" %%a in ('type 1.txt') do (
  8. set m=
  9. set /a n+=1
  10. for /f "delims=" %%b in ('type 2.txt') do (
  11. set /a m+=1
  12. if "!n!" == "!m!" (
  13. echo %%a
  14. echo %%b
  15. )
  16. )
  17. )
  18. if !a! gtr !b! more 1.txt +!t1!
  19. if !a! lss !b! more 2.txt +!t2!
  20. )
  21. pause
复制代码

TOP

兼容两文件行数不同情况。
  1. @echo off&setlocal enabledelayedexpansion
  2. set/a n=0,m=0
  3. for /f "delims=" %%a in (2.txt) do set/a n+=1&set #!n!=%%a
  4. for /f "delims=" %%a in (1.txt) do (
  5. set/a m+=1
  6. if defined #!m! (echo %%a&call echo %%#!m!%%) else echo %%a
  7. )
  8. set /a m+=1
  9. if !n! gtr !m! for /l %%i in (!m!,1,!n!) do echo !#%%i!
  10. pause
复制代码

TOP

原帖由 netbenton 于 2009-4-30 07:38 发表
楼上的不一定会交替的吧?
有可能会这样的
a.txt  行
b.txt  行
b.txt  行
a.txt  行

  1. for /l %%i in (1,1,40) do (
  2. echo A:%%i >>a.txt
  3. echo B:%%i>>b.txt
  4. )
复制代码


你试了没有

TOP

re 36楼

是我搞错了,呵呵,没注到前面的是find,而不是findstr


君的方法,不知道这样是不是可以不限行数了呢:
find /v /n "" ?.txt |findstr "[ ]"|sort

TOP

也来试试

自己写了一个,感觉前两行速度有点慢,其他都很快,利用for /f加goto偷鸡。。。
  1. @echo off
  2. set /p line1=<1.txt&set /p line2=<2.txt
  3. echo %line1%&echo %line2%
  4. :loop
  5. set /a lines+=1
  6. set erl=0
  7. for /f "skip=%lines%" %%a in (1.txt) do echo %%a&set /a erl+=1&goto loop_1
  8. :loop_1
  9. for /f "skip=%lines%" %%a in (2.txt) do echo %%a&goto loop
  10. if %erl%==0 (pause) else (goto loop)
复制代码
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

稍加更改

改了一下,前两行的显示貌似要快点,实际上与LS的代码都是一样快的(测试耗时:0.05秒)
  1. @echo off
  2. for /f %%a in (1.txt) do echo %%a&for /f %%b in (2.txt) do echo %%b&goto loop
  3. :loop
  4. set /a lines+=1
  5. set erl=0
  6. for /f "skip=%lines%" %%a in (1.txt) do echo %%a&set /a erl+=1&goto loop_1
  7. :loop_1
  8. for /f "skip=%lines%" %%a in (2.txt) do echo %%a&goto loop
  9. if %erl%==0 (pause) else (goto loop)
复制代码
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

原帖由 netbenton 于 2009-4-30 23:34 发表
是我搞错了,呵呵,没注到前面的是find,而不是findstr


君的方法,不知道这样是不是可以不限行数了呢:
find /v /n "" ?.txt |findstr "[ ]"|sort


应该不行,把不同位数的行数分捡开来是为了让sort来正确排序,否则会排成
1
10
11
2
20
21
3
....
这样
超过一百行要再加一句
  1. for /f "tokens=1* delims=[]" %%a in ('find /v /n "" ?.txt^|findstr /b "\[[0-9][0-9][0-9]\]"^|sort') do echo.%%b >>out.txt
复制代码

TOP

再把老古董翻出来晒晒吧 :-P

第一眼看到这个题目
下意识就想到用find+sort
后来发现everest79 已经有了类似的解题思路了
东施效颦的事我可不想做
本来就想放弃的

再后来我突然又想起了阔别很久的文物程序fc
也把它翻出来晒晒后
证实思路是可行的
  1. @(for /f "tokens=1* delims=: " %%a in ('fc /lb10000 /n ?.txt %SystemDrive%\io.sys^|find ": "^|sort') do @echo.%%b)>out2.txt
复制代码
比everest79的代码简单一些倒是其次
最关键的是这是一个新的创意

本以为万事大吉
可是再再后来又注意到netbenton与everest79 的对话
发现无论如何也不明白everest79的代码
怎么就避免了netbenton所说的错行问题

因为sort是按文本顺序排序的
而且无法指定排序起始点
不能指定排序停止点
那么文本的内容必然会影响到文本的顺序
试验证实也确实如此

关键糟糕的是
我的代码也存在同样的问题
而且它也把两个文本行首的空格给过滤掉了
于是只好再翻翻doshelp
终于找到解法

用findstr给文本行加个文件名前缀
让sort可以按照我们的规矩“正常排序”
而文本行首的空格也给保留了

虽然使用了临时文件
而且也多了两句代码
但这是没办法的事情
何况效率也没大影响
索性就这样结束了吧
  1. @echo off
  2. for %%f in (1.txt 2.txt) do findstr $ %%f? > %temp%\~%%~nf.%~n0
  3. (for /f "tokens=2* delims=:" %%a in ('fc /lb10000 /n %temp%\~*.%~n0 %SystemDrive%\io.sys^|find ": "^|sort') do echo.%%b)>out3.txt
  4. del %temp%\~*.%~n0
复制代码
2

评分人数

    • zqz0012005: 吃的盐多,过的桥多,老成精了技术 + 1
    • batman: 高手一出手就知有没有PB + 10

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "xp=goto :eof"
  4. for /f "delims=" %%i in (1.txt) do (set "me=%%j"&echo %%i&call :a)
  5. set xp=&set vs=pause
  6. goto a
  7. :a
  8. for /f "%a% delims=" %%j in (2.txt) do (echo %%j&set /a b+=1&set a=skip=!b!
  9. %xp%)
  10. %vs%
复制代码

[ 本帖最后由 ccr438758900 于 2010-1-13 00:22 编辑 ]

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. ::先获取行数并把 行数较大的文本设为和t1另一个为t2
  3. for %%a in ('sed "$=" a.txt') do (
  4. for %%b in ('sed "$=" b.txt') do (
  5. if %%a gtr %%b (
  6. set "t1=a.txt"
  7. set "t2=b.txt"
  8. ) else (
  9. set "t1=b.txt"
  10. set "t2=a.txt"
  11. )
  12. )
  13. )
  14. ::交叉输出t1和t2
  15. for /f "delims=" %%i in (!t1!) do (
  16. set /a n+=1
  17. echo %%i
  18. for /f "tokens=1,* delims=:" %%j in ('findstr /n ".*" !t2!') do (
  19. if %%j equ !n! echo %%k
  20. )
  21. )
  22. pause
复制代码

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1 delims=:" %%i in ('findstr /n .* a.txt') do set num1=%%i
  3. for /f "tokens=1 delims=:" %%i in ('findstr /n .* b.txt') do set num2=%%i
  4. if !num1! geq !num2! ( goto start
  5.   ) else (
  6.   ren  a.txt c.txt
  7.   ren  b.txt a.txt
  8.   ren  c.txt b.txt
  9. )
  10. :start
  11. set /a line=0
  12. for /f "delims=" %%a in (a.txt) do (
  13.     echo %%a
  14.     set /a c=0
  15.     for /f "delims=" %%b in ('more +!line! "b.txt"') do (
  16.     set /a c+=1
  17.     if !c! equ 1 echo %%b
  18.     )
  19.     set /a line+=1
  20. )
  21. pause>nul
复制代码
这个代码的缺陷在于每读取1.txt中一行都得把2.txt中内容遍历一次。但是我想不出办法让让读取2.txt的for只运行一个循环、用goto会出错。哎~~~

[ 本帖最后由 vincentzhou 于 2011-1-2 16:55 编辑 ]
only the strong survive!

TOP

高手啊弄多语句

TOP

回复 41楼 的帖子

本帖最近评分记录
zqz0012005 技术 +1 吃的盐多,过的桥多,老成精了 2010-1-14 12:44

这个评论果然中肯!这样的命令和用法也能联想到一起,还能奏奇效,不服不行!

TOP

41楼的兄弟果然厉害,我也想到FC,但没想不出解决办法。
再想来,应该可以依靠类似“多线程”的方法来同时打开2个FOR来做文本读取,但控制输出顺序。
因为变量空间不同,必须依靠临时文件来做到这点,比如可以将控制信息写入流文件3.txt:ctrl.txt。

CMD要是能够实现内存映射,多进程使用公共变量就好了。。

TOP

这是刚想到的,没41楼的巧妙
  1. @echo off
  2. (for /f "delims=" %%a in ('findstr /n .* a.txt') do echo [%%a)>ab.txt
  3. find /v /n "" b.txt|more>>ab.txt +2
  4. for /f "tokens=1* delims=:]" %%a in ('sort ab.txt') do echo;%%b
  5. pause
复制代码

[ 本帖最后由 zm900612 于 2011-2-22 18:17 编辑 ]

TOP

返回列表