中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-28 02:41
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 两个文本跳行输出(难题) 查看 2,242 回复 24
楼 主 两个文本跳行输出(难题) 发表于 2008-04-01 03:42 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
===============================================
虽然目前还没有人达到开始的要求主(可能是一个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
2 发表于 2008-04-01 04:12 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
呵呵,
为何非要在一个循环中完成,你的那个代码,效率是个大问题,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 ]
致精致简!
3 发表于 2008-04-01 11:04 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
Originally posted by 26933062 at 2008-4-1 04:12:
呵呵,
为何非要在一个循环中完成,你的那个代码,效率是个大问题,1.txt有多少行,就要把2.txt循环多少遍。。。
怎么才算是一个循环啊?我觉得 ...

我的意思是在一个for镶嵌中解决这个问题,不然就谈不上难了,呵呵。
批处理之家新域名:www.bathome.net
4 发表于 2008-04-01 11:52 ·  中国 江苏 苏州 移动
银牌会员
★★★
积分 1,608
发帖 780
注册 2007-10-07 10:19
18年会员
UID 99089
性别 男
状态 离线

@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
5 不在一个循环中的解决方案: 发表于 2008-04-01 12:09 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
还是没达到我最初的想法,但通用性还好,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
6 发表于 2008-04-01 12:57 ·  中国 江苏 苏州 移动
银牌会员
★★★
积分 1,608
发帖 780
注册 2007-10-07 10:19
18年会员
UID 99089
性别 男
状态 离线
想知道多少行还不简单
列出两个行后,进行比较不就行了?
7 发表于 2008-04-01 13:25 ·  中国 北京 华为云
银牌会员
★★★
积分 1,436
发帖 739
注册 2007-10-11 17:44
18年会员
UID 99469
性别 男
状态 离线
P不容易就换别的嘛。
8 发表于 2008-04-01 13:52 ·  中国 北京 联通
中级用户
★★
替身
积分 269
发帖 130
注册 2007-03-23 21:41
19年会员
UID 82683
性别 女
状态 离线
虽然操作有些麻烦还是可以勉强实现的,不过代码多了点而已,唉

@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
9 发表于 2008-04-01 14:07 ·  中国 江苏 苏州 移动
银牌会员
★★★
积分 1,608
发帖 780
注册 2007-10-07 10:19
18年会员
UID 99089
性别 男
状态 离线

@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
)

这个总应该行
10 发表于 2008-04-01 14:14 ·  中国 北京 华为云
银牌会员
★★★
积分 1,436
发帖 739
注册 2007-10-11 17:44
18年会员
UID 99469
性别 男
状态 离线
Originally posted by ansipeter at 2008-4-1 01:52 PM:
虽然操作有些麻烦还是可以勉强实现的,不过代码多了点而已,唉

@echo off&setlocal
for /f "delims=: tokens=1*" %%a in ('findstr /n .* 1.txt') do call ...

说说怎么讨厌9527?
11 发表于 2008-04-01 14:31 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
Originally posted by huahua0919 at 2008-4-1 14:07:

@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
12 发表于 2008-04-01 14:33 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
Originally posted by ansipeter at 2008-4-1 13:52:
虽然操作有些麻烦还是可以勉强实现的,不过代码多了点而已,唉

@echo off&setlocal
for /f "delims=: tokens=1*" %%a in ('findstr /n .* 1.txt') do call ...

你的和我一楼的代码效果一样,会丢掉行数多的txt中多出的行。
批处理之家新域名:www.bathome.net
13 发表于 2008-04-01 14:51 ·  中国 北京 联通
中级用户
★★
替身
积分 269
发帖 130
注册 2007-03-23 21:41
19年会员
UID 82683
性别 女
状态 离线
楼上的,你测试了吗?对,我的代码是有些通用性不好,必须在for /f "delims=: tokens=1*" %%a in ('findstr /n .* 1.txt') do call:ansi %%a "%%b"这句放置行多的那个文件,我这里测试通过,如果要是怎么放都可以的话,那添加个判断就可以很好的通用了,唉
14 发表于 2008-04-01 16:35 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
20年会员
UID 42345
状态 离线
我来一个 虽然多一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 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
bat-zw +4 2008-04-01 20:37
简单!简单!再简单!
15 发表于 2008-04-01 16:35 ·  中国 江苏 苏州 移动
银牌会员
★★★
积分 1,608
发帖 780
注册 2007-10-07 10:19
18年会员
UID 99089
性别 男
状态 离线
楼主可嘉

@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
论坛跳转: