中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] »
作者:
标题: 两个文本跳行输出(难题) 上一主题 | 下一主题
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 16 楼』:  



  Quote:
Originally posted by terse at 2008-4-1 16:35:
我来一个 虽然多一FOR 但有效 怎么多个%%I
@echo off
for /f "delims=" %%i in (a.txt) do >>c.txt echo %%i&call :loop
for /f "delims=" %%i in (b.txt) do i ...

学习!!!!!!!!!!



批处理之家新域名:www.bathome.net
2008-4-1 20:38
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 17 楼』:  



  Quote:
@echo off
for /f "delims=" %%i in (a.txt) do >>c.txt echo %%i&call :loop
for /f "delims=" %%i in (b.txt) do if not defined %%i  echo %%i>>c.txt
pause
goto :eof
:loop
for /f "delims=" %%i in (b.txt) do if not defined %%i set %%i=A &>>c.txt echo %%i&goto :eof

 不好意思,为了得到提高,本人虽然水平有限,还是试着解释这段代码如下:
 第一个for循环表示从a.txt中依次读取每行,每读取一行就把这行添加输入到c.txt中然后跳转到第二个for循环中;
 第二个for循环的意思是依次读取b.txt中每一行,每读一行就把存在于循环中%%i变量(第二个for循环的%%i),在b.txt中这行中查找一次,如果没发现就把这一行改变变量名为A并添加输入到c.txt中,然后结束再开始第一个for循环,这样后面的每次循环就不会查找这一行了(其变量名为A而不是%%i);
 而当第一个大循环也就是第一和第二个for循环结束后,便开始了第三个for语句的循环,在这个for循环中就是一行行地对b.txt查找在当前循环中是否有变量%%i(同样行,其余的行的变量名都变成A了)的存在,如没有就添加输入到c.txt中。
 真的好难解释啊!!!!!!!!!!!!
 总结:trse巧妙的将三个for循环中的变量都命名为%%i,同时反复运用 if (not) defined语句进行查找识别,成功的实现了对a.txt和b.txt跳行并不丢失行的输出,实在是高,佩服!!!



批处理之家新域名:www.bathome.net
2008-4-1 21:37
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 18 楼』:  

原来是在不知道哪个文件行数多的情况下
如此把2楼代码稍作修改即可达到楼主的要求
:
@echo off&cd.>c.txt
set max=-1
for /f "delims=" %%a in (1.txt) do (
   >>c.txt echo %%a&set /a max+=1
   call :loop %%max%%
)
set /a max+=1
set flag=a
:loop
if %max% equ 0 (set skip=) else set "skip=skip=%max%"
for /f "%skip% delims=" %%i in (2.txt) do (
   >>c.txt echo %%i
   if not defined flag goto :eof
)
if not defined flag (goto :eof) else start c.txt&exit
另外: 2 楼的第一个代码到底哪里不行?怎么不通用?

[ Last edited by 26933062 on 2008-4-1 at 09:43 PM ]



致精致简!
2008-4-1 21:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 19 楼』:  感谢兄弟对本贴的多次关注:



  Quote:
Originally posted by 26933062 at 2008-4-1 21:40:
原来是在不知道哪个文件行数多的情况下
如此把2楼代码稍作修改即可达到楼主的要求
:[code]
@echo off&cd.>c.txt
set max=-1
for /f "delims=" %%a i ...

但你的代码还是有问题,你可测试下看。



批处理之家新域名:www.bathome.net
2008-4-1 21:46
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 20 楼』:  

代码有问题?
我测试没问题啊?
你测试有什么问题?说说啊?



致精致简!
2008-4-1 21:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
balinger
中级用户




积分 356
发帖 115
注册 2004-7-27
状态 离线
『第 21 楼』:  

14楼的思路的确奇妙,令人佩服!
不过还有个小问题,如果 b.txt 中有相同的行,就会出错。

2008-4-1 21:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
topmcs
初级用户





积分 25
发帖 16
注册 2008-4-1
来自 湖南
状态 离线
『第 22 楼』:  

高手!!!!!!!!!11

2008-4-2 11:58
查看资料  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 23 楼』:  



  Quote:
Originally posted by balinger at 2008-4-1 21:58:
14楼的思路的确奇妙,令人佩服!
不过还有个小问题,如果 b.txt 中有相同的行,就会出错。

确实如此  改这样
@echo off
for /f "delims=" %%i in (a.txt) do echo %%i&call :loop
for /f "%n% delims=" %%i in (b.txt) do echo %%i
pause
goto :eof
:loop
for /f "%n% tokens=1* delims=:" %%i in ('findstr /n .* "b.txt"') do set n=skip=%%i &echo %%j&goto :eof

   此帖被 +4 点积分        点击查看详情   
评分人:【 bat-zw 分数: +4  时间:2008-4-2 13:51




简单!简单!再简单!
2008-4-2 12:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 24 楼』:  高!!!!!!!!!!!!!

for /f "%n% tokens=1* delims=:" %%i in ('findstr /n .* "b.txt"') do set n=skip=%%i &echo %%j&goto :eof
使用"delims=:" "findstr /n" "%%n=skip=%%i" 把%%i变量变为行号,思路的确是太广了。

[ Last edited by zw19750516 on 2008-4-2 at 01:55 PM ]



批处理之家新域名:www.bathome.net
2008-4-2 13:51
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 25 楼』:  基本在一个大循环解决问题的方案:

通用范围为1-999行
@echo off
set n=-1
for /f "delims=" %%i in ('findstr /n .* a.txt') do (
    set a=%%i
    set /a n+=1
    set /a v=n+1
    setlocal enabledelayedexpansion
    set a=!a:*:=!&echo !a!&call :lp
    endlocal
)
for /f "skip=%n% delims=" %%i in ('findstr .* b.txt') do echo %%i
pause&goto :eof
:lp
set m=skip=!n!
if "!m!"=="skip=0" set m=
for /f "delims= %m%" %%i in ('findstr /n .* b.txt') do (
    set b=%%i
    if "!b:~,1!"=="!v!" set b=!b:*:=!&echo !b!&goto :eof
    if "!b:~,2!"=="!v!" set b=!b:*:=!&echo !b!&goto :eof
    if "!b:~,3!"=="!v!" set b=!b:*:=!&echo !b!&goto :eof
)
[ Last edited by zw19750516 on 2008-4-2 at 11:47 PM ]



批处理之家新域名:www.bathome.net
2008-4-2 21:26
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: