|
bat-zw
金牌会员
      永远的学习者
积分 3105
发帖 1276
注册 2008-3-8
状态 离线
|
『楼 主』:
两个文本跳行输出(难题)
使用 LLM 解释/回答一下
===============================================
虽然目前还没有人达到开始的要求主(可能是一个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 |
|
|
26933062
银牌会员
    
积分 2268
发帖 879
注册 2006-12-19
状态 离线
|
『第 2 楼』:
使用 LLM 解释/回答一下
呵呵,
为何非要在一个循环中完成,你的那个代码,效率是个大问题,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 楼』:
使用 LLM 解释/回答一下
Originally posted by 26933062 at 2008-4-1 04:12:
呵呵,
为何非要在一个循环中完成,你的那个代码,效率是个大问题,1.txt有多少行,就要把2.txt循环多少遍。。。
怎么才算是一个循环啊?我觉得 ...
我的意思是在一个for镶嵌中解决这个问题,不然就谈不上难了,呵呵。
|

批处理之家新域名:www.bathome.net |
|
2008-4-1 11:04 |
|
|
huahua0919
银牌会员
    
积分 1608
发帖 780
注册 2007-10-7
状态 离线
|
『第 4 楼』:
使用 LLM 解释/回答一下
@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 楼』:
不在一个循环中的解决方案:
使用 LLM 解释/回答一下
还是没达到我最初的想法,但通用性还好,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 |
|
|
huahua0919
银牌会员
    
积分 1608
发帖 780
注册 2007-10-7
状态 离线
|
|
2008-4-1 12:57 |
|
|
abcd
银牌会员
    
积分 1436
发帖 739
注册 2007-10-11
状态 离线
|
|
2008-4-1 13:25 |
|
|
ansipeter
中级用户
   替身
积分 269
发帖 130
注册 2007-3-23
状态 离线
|
『第 8 楼』:
使用 LLM 解释/回答一下
虽然操作有些麻烦还是可以勉强实现的,不过代码多了点而已,唉
@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 楼』:
使用 LLM 解释/回答一下
@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 楼』:
使用 LLM 解释/回答一下
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?
|
|
2008-4-1 14:14 |
|
|
bat-zw
金牌会员
      永远的学习者
积分 3105
发帖 1276
注册 2008-3-8
状态 离线
|
『第 11 楼』:
使用 LLM 解释/回答一下
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 |
|
2008-4-1 14:31 |
|
|
bat-zw
金牌会员
      永远的学习者
积分 3105
发帖 1276
注册 2008-3-8
状态 离线
|
『第 12 楼』:
使用 LLM 解释/回答一下
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 |
|
2008-4-1 14:33 |
|
|
ansipeter
中级用户
   替身
积分 269
发帖 130
注册 2007-3-23
状态 离线
|
『第 13 楼』:
使用 LLM 解释/回答一下
楼上的,你测试了吗?对,我的代码是有些通用性不好,必须在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 楼』:
使用 LLM 解释/回答一下
我来一个 虽然多一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 ]
|

简单!简单!再简单! |
|
2008-4-1 16:35 |
|
|
huahua0919
银牌会员
    
积分 1608
发帖 780
注册 2007-10-7
状态 离线
|
『第 15 楼』:
使用 LLM 解释/回答一下
楼主可嘉
@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 |
|