中国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
状态 离线
『楼 主』:  两个文本跳行输出(难题)

===============================================
虽然目前还没有人达到开始的要求主(可能是一个for镶嵌根本做不到),但还是有了比较完美的方案=======>见14楼,同时本人在17楼对这段代码进行了粗略的分析。
===================================
本人苦思多日,终于想到了基本在一个大循环中解决的方案,==>见25楼
文本1.txt
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
ccccccccccccccccccccccccccccccccccccccc
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
ggggggggggggggggggggggggggggggggggggggg
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
文本2.txt
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
要求用批处理输出为
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
ccccccccccccccccccccccccccccccccccccccc
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
ggggggggggggggggggggggggggggggggggggggg
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
我写下的如下代码:
@echo off
for /f "tokens=*" %%i in ('findstr /n .* 1.txt') do (
    for /f "tokens=*" %%j in ('findstr /n .* 2.txt') do (   
        set var=%%i
        set str=%%j   
        setlocal enabledelayedexpansion
        if "!var:~,1!"=="!str:~,1!" echo !var:~2,50!&echo !str:~2,50!
        endlocal
    )
)
pause
输出为:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
ccccccccccccccccccccccccccccccccccccccc
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
ggggggggggggggggggggggggggggggggggggggg
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
丢了1.txt最后两行,搞了好久都没解决,只好请教大家了(注,要在一个循环中解决)。

[ Last edited by zw19750516 on 2008-4-2 at 09:54 PM ]



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





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

呵呵,
为何非要在一个循环中完成,你的那个代码,效率是个大问题,1.txt有多少行,就要把2.txt循环多少遍。。。
怎么才算是一个循环啊?我觉得你的这个代码就应该不叫一个循环。所谓一个循环,应该是说只把一个文档循环一次。
另外,1.txt和2.txt的行数不一样,最后1.txt多的行怎么处理?
你给的标准输出,好像也有错误啊,wwwwwwww那一行去哪啦?

:
@echo off
for /f "tokens=1* delims=:" %%a in ('findstr /n .* 1.txt') do (
   set __%%a=%%b&set max=%%a
)
for /f "tokens=1* delims=:" %%a in ('findstr /n .* 2.txt') do (
   set ++%%a=%%b&set str=%%a
)
if %str% gtr %max% set max=%str%
setlocal enabledelayedexpansion
for /l %%a in (1 1 %max%) do (
  if defined __%%a echo !__%%a!
  if defined ++%%a echo !++%%a!
)
pause
:
@echo off
set max=-1
for /f "delims=" %%a in (1.txt) do (
   echo %%a&set /a max+=1
   call :loop %%max%%
)
pause
:loop
if %max% equ 0 (set skip=) else set "skip=skip=%max%"
for /f "%skip% delims=" %%i in (2.txt) do echo %%i&goto :eof
goto :eof
[ Last edited by 26933062 on 2008-4-1 at 04:28 AM ]



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

永远的学习者


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



  Quote:
Originally posted by 26933062 at 2008-4-1 04:12:
呵呵,
为何非要在一个循环中完成,你的那个代码,效率是个大问题,1.txt有多少行,就要把2.txt循环多少遍。。。
怎么才算是一个循环啊?我觉得 ...

我的意思是在一个for镶嵌中解决这个问题,不然就谈不上难了,呵呵。



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




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


@ECHO OFF
findstr /n .* a.txt>>c.txt
echo.>>c.txt
findstr /n .* b.txt>>c.txt
for /l %%i in (1 1 6) do (
findstr %%i: c.txt >>d.txt
)
for /f "delims=: tokens=1*" %%a in (d.txt) do (
echo %%b>>e.txt
)
del c.txt
del d.txt


2008-4-1 11:52
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 5 楼』:  不在一个循环中的解决方案:

还是没达到我最初的想法,但通用性还好,2楼、四楼的代码通用性还不行:
1 实际上我们不可能每次都知道到底1.txt和2.txt哪个的行数多(针对2楼的)
2 我们也不可能每次都知道1.txt和2.txt都有多少行(针对4楼的)
如意见不对,请指正,目的只有一个为了提高。
@echo off
for /f "tokens=*" %%i in ('findstr /n .* 1.txt') do (
    for /f "tokens=*" %%j in ('findstr /n .* 2.txt') do (   
        set var=%%i
        set str=%%j   
        setlocal enabledelayedexpansion
        if "!var:~,2!"=="!str:~,2!" echo !var:~2,50!&echo !str:~2,50!
        endlocal
    )
)
for /f "delims=: tokens=1" %%i in ('findstr /n .* 1.txt') do set n=%%i
for /f "delims=: tokens=1" %%j in ('findstr /n .* 2.txt') do set m=%%j
if %n% equ %m% pause&goto :eof
if %n% lss %m% goto 2
:1
set /a n=%m%
for /f "skip=%n%" %%i in (1.txt) do echo %%i
pause&goto :eof
:2
set /a n=%n%
for /f "skip=%n%" %%j in (2.txt) do echo %%j
pause&goto :eof
[ Last edited by zw19750516 on 2008-4-1 at 04:33 PM ]



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




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

想知道多少行还不简单
列出两个行后,进行比较不就行了?

2008-4-1 12:57
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
abcd
银牌会员





积分 1436
发帖 739
注册 2007-10-11
状态 离线
『第 7 楼』:  

P不容易就换别的嘛。

2008-4-1 13:25
查看资料  发短消息 网志  OICQ (470237592)  编辑帖子  回复  引用回复
ansipeter
中级用户

替身



积分 269
发帖 130
注册 2007-3-23
状态 离线
『第 8 楼』:  

虽然操作有些麻烦还是可以勉强实现的,不过代码多了点而已,唉
@echo off&setlocal
for /f "delims=: tokens=1*" %%a in ('findstr /n .* 1.txt') do call:ansi %%a "%%b"
goto:eof
:ansi
echo %~2
for /f "delims=: tokens=1*" %%y in ('findstr /n .* 2.txt^|findstr "^%1:.*"') do echo %%z




*讨厌的9527*  
2008-4-1 13:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
huahua0919
银牌会员




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


@ECHO OFF
findstr /n .* a.txt>>c.txt
for /f "delims=: tokens=1" %%i in (c.txt) do set max1=%%i
echo.>>c.txt
findstr /n .* b.txt>>c.txt
for /f "delims=: tokens=1" %%i in (c.txt) do set max2=%%i
set/a max=(max2-max1)-max1
if %max% leq 0 (set/a max=max1) else (set/a max=max2-max1)
for /l %%a in (1 1 %max%) do (
findstr %%a: c.txt >>d.txt
)
for /f "delims=: tokens=1*" %%a in (d.txt) do (
echo %%b>>e.txt
)
这个总应该行

2008-4-1 14:07
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
abcd
银牌会员





积分 1436
发帖 739
注册 2007-10-11
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by ansipeter at 2008-4-1 01:52 PM:
虽然操作有些麻烦还是可以勉强实现的,不过代码多了点而已,唉
[code]
@echo off&setlocal
for /f "delims=: tokens=1*" %%a in ('findstr /n .* 1.txt') do call ...

说说怎么讨厌9527?

2008-4-1 14:14
查看资料  发短消息 网志  OICQ (470237592)  编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


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



  Quote:
Originally posted by huahua0919 at 2008-4-1 14:07:
[code]
@ECHO OFF
findstr /n .* a.txt>>c.txt
for /f "delims=: tokens=1" %%i in (c.txt) do set max1=%%i
echo.>>c.txt
findstr /n .* b.txt>>c.txt
for /f "delims=: ...

代码有问题,测试后e.txt内容如下:
11

[ Last edited by zw19750516 on 2008-4-1 at 02:33 PM ]



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

永远的学习者


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



  Quote:
Originally posted by ansipeter at 2008-4-1 13:52:
虽然操作有些麻烦还是可以勉强实现的,不过代码多了点而已,唉
[code]
@echo off&setlocal
for /f "delims=: tokens=1*" %%a in ('findstr /n .* 1.txt') do call ...

你的和我一楼的代码效果一样,会丢掉行数多的txt中多出的行。



批处理之家新域名:www.bathome.net
2008-4-1 14:33
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
ansipeter
中级用户

替身



积分 269
发帖 130
注册 2007-3-23
状态 离线
『第 13 楼』:  

楼上的,你测试了吗?对,我的代码是有些通用性不好,必须在for /f "delims=: tokens=1*" %%a in ('findstr /n .* 1.txt') do call:ansi %%a "%%b"这句放置行多的那个文件,我这里测试通过,如果要是怎么放都可以的话,那添加个判断就可以很好的通用了,唉



*讨厌的9527*  
2008-4-1 14:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





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

我来一个 虽然多一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 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

上面处理不了b.txt重复行  所以改一下:
@echo off
for /f "delims=" %%i in (a.txt) do >>c.txt echo %%i&call :loop
for /f "%n% delims=" %%i in (b.txt) do >>c.txt echo %%i
pause
goto :eof
:loop
for /f "%n% tokens=1* delims=:" %%i in ('findstr /n .* "b.txt"') do set n=skip=%%i &>>c.txt echo %%j&goto :eof

[ Last edited by terse on 2008-4-2 at 12:53 PM ]

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




简单!简单!再简单!
2008-4-1 16:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
huahua0919
银牌会员




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

楼主可嘉
@ECHO OFF
findstr /n .* a.txt>>c.txt
for /f "delims=: tokens=1" %%i in (c.txt) do set max1=%%i
echo.>>c.txt
findstr /n .* b.txt>>c.txt
findstr /n .* b.txt>>m.txt
for /f "delims=: tokens=1" %%i in (c.txt) do set max2=%%i
set /a max=max1-max2
if %max% leq 0 (set/a max=max2) else (set/a max=max1)
for /l %%a in (1 1 %max%) do (
findstr %%a: c.txt >>d.txt
)
for /f "delims=: tokens=1*" %%a in (d.txt) do (
echo %%b>>e.txt
)
del m.txt&&del c.txt&&del d.txt


2008-4-1 16:35
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: