中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-28 01:15
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 两个文本跳行输出(难题) 查看 2,238 回复 24
16 发表于 2008-04-01 20:38 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
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
17 发表于 2008-04-01 21:37 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
@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
18 发表于 2008-04-01 21:40 ·  中国 湖南 娄底 冷水江市 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
原来是在不知道哪个文件行数多的情况下
如此把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 ]
致精致简!
19 感谢兄弟对本贴的多次关注: 发表于 2008-04-01 21:46 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
Originally posted by 26933062 at 2008-4-1 21:40:
原来是在不知道哪个文件行数多的情况下
如此把2楼代码稍作修改即可达到楼主的要求
:

@echo off&cd.>c.txt
set max=-1
for /f "delims=" %%a i ...

但你的代码还是有问题,你可测试下看。
批处理之家新域名:www.bathome.net
20 发表于 2008-04-01 21:51 ·  中国 湖南 娄底 冷水江市 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
代码有问题?
我测试没问题啊?
你测试有什么问题?说说啊?
致精致简!
21 发表于 2008-04-01 21:58 ·  中国 福建 福州 连江县 电信
中级用户
★★
积分 356
发帖 115
注册 2004-07-27 00:00
21年会员
UID 29114
性别 男
状态 离线
14楼的思路的确奇妙,令人佩服!
不过还有个小问题,如果 b.txt 中有相同的行,就会出错。
22 发表于 2008-04-02 11:58 ·  中国 湖南 长沙 电信
初级用户
积分 25
发帖 16
注册 2008-04-01 23:43
18年会员
UID 114706
性别 男
来自 湖南
状态 离线
高手!!!!!!!!!11
23 发表于 2008-04-02 12:50 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
20年会员
UID 42345
状态 离线
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
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
bat-zw +4 2008-04-02 13:51
简单!简单!再简单!
24 高!!!!!!!!!!!!! 发表于 2008-04-02 13:51 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
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
25 基本在一个大循环解决问题的方案: 发表于 2008-04-02 21:26 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
通用范围为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
论坛跳转: