标题: [文本处理] 批处理怎样交替输出两个文本文件的内容让所有行都配对一次? [打印本页]
作者: lj84831253 时间: 2010-4-23 09:50 标题: 批处理怎样交替输出两个文本文件的内容让所有行都配对一次?
比如说有a.txt和b.txt两个文件。
a.txt里的内容为:
A
B
C
D
b.txt的内容为:
1
2
3
要求输出结果为:
A1
B2
C3
D1
A2
B3
C1
D2
A3
B1
C2
D3
就是两个文件的每行都各自匹配一次输出,所以实际的输出次数为:a.txt的行数×b.txt的行数。
注意:a.txt与b.txt哪个文件的行数多不一定。
谢谢大家了呵呵,大家也可以当个习题来做。
可以使用第三方。
作者: sky02 时间: 2010-4-23 10:45
暴力破解密码的吗??
作者: lj84831253 时间: 2010-4-23 11:12
原理跟暴力破解差不多吧,呵呵。不过不是搞暴力破解。
作者: yangfengoo 时间: 2010-4-23 11:37
- @echo off & setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do set a%%a=%%b&set x1=%%a
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* b.txt') do set b%%a=%%b&set x2=%%a
- set /a x=!x1!*!x2!,xx1=1,xx2=1
- for /l %%a in (1 1 !x!) do (
- call :xx
- set/a xx1+=1,xx2+=1
- if !xx1! gtr !x1! set xx1=1
- if !xx2! gtr !x2! set xx2=1
- )
- pause
- :xx
- call echo.%%a%xx1%%%%%b%xx2%%%
复制代码
作者: lj84831253 时间: 2010-4-23 13:38
请问tokens=1*是什么意思?谢谢!!
[ 本帖最后由 lj84831253 于 2010-4-23 13:41 编辑 ]
作者: GNU 时间: 2010-4-23 14:07 标题: 回复 5楼 的帖子
这是tokens=1*和findstr /n联合使用的一个典型例子,%%a是findstr /n加上的行号,%%b是行号后面的整行内容。
作者: lj84831253 时间: 2010-4-23 14:24
原帖由 GNU 于 2010-4-23 14:07 发表
这是tokens=1*和findstr /n联合使用的一个典型例子,%%a是findstr /n加上的行号,%%b是行号后面的整行内容。
如果这里不加*号可以吗?为什么要加一个*号?
还有,最后一句call echo 那里好多百分号,,能帮我讲解一下吗?直接echo.a%xx1%b%xx2%不可以吗?
谢谢。
作者: x9tiancmd 时间: 2010-4-23 15:17
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%i in ('findstr /n ".*" b.txt') do set b=%%i&set b_%%i=%%j
- for /f "tokens=1* delims=:" %%i in ('findstr /n ".*" a.txt') do if %%i leq %b% (echo.%%j!b_%%i! ) else (set/a num=%%i-b&call echo.%%j%%b_!num!%%)
复制代码
作者: hanyeguxing 时间: 2010-4-23 20:37
原帖由 x9tiancmd 于 2010-4-23 15:17 发表
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1* delims=:" %%i in ('findstr /n ".*" b.txt') do set b=%%i&set b_%%i=%%j
for /f "tokens=1* delims=:" %%i in ('findstr /n ".*" a.txt') do if %%i leq %b% (echo.%%j!b_%%i! ) else (set/a num=%%i-b&call echo.%%j%%b_!num!%%)
1,如果不考虑顺序,直接for /f套for /f就可以
2,如果需要按1楼给出的顺序输出,那么显然a和b的文本都被循环了多次,所以两次解析文本时,都应该只定义为变量。然后在根据乘后的积使用for /l(实际就是变相for /f套for /f)。
3,你写的代码,就只for /f了一次,所以只输出a文本的行数。。。
[ 本帖最后由 hanyeguxing 于 2010-4-24 15:41 编辑 ]
作者: GNU 时间: 2010-4-23 20:59 标题: 回复 7楼 的帖子
不加*只能取到第一列,肯定不行。
call跟变量延迟扩展有关系,参考:
http://bbs.bathome.net/thread-2899-1-1.html
作者: lj84831253 时间: 2010-4-24 12:57
为什么我测试不成功啊?请大家下载附件也测试下。(PS:a.txt和b.txt里边都没重复行。)
作者: lj84831253 时间: 2010-4-24 13:21
急求呀,,正在写脚本,,碰到坎儿了。。。
作者: GNU 时间: 2010-4-24 13:48 标题: 回复 11楼 的帖子
你的b.txt是从Linux系统里面导出来的?行尾不是CRLF,只是一个LF,所以BAT处理的时候出错了。
作者: yangfengoo 时间: 2010-4-24 13:53
b.txt 有问题里面隐含了换行符
代码没问题
作者: lj84831253 时间: 2010-4-24 13:56
我听不懂呀,,唉,我菜。请问那该怎么解决呢?
作者: hanyeguxing 时间: 2010-4-24 14:02
先用:- for /f "delims=" %%i in ('type b.txt') do >>b-.txt echo %%i
复制代码
把b.txt处理了
或者把4楼的改成:- @echo off & setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do set a%%a=%%b&set x1=%%a
- for /f "tokens=1* delims=:" %%a in ('type b.txt^|findstr /n .*') do set b%%a=%%b&set x2=%%a
- set /a x=!x1!*!x2!,xx1=1,xx2=1
- for /l %%a in (1 1 !x!) do (
- call :xx
- set/a xx1+=1,xx2+=1
- if !xx1! gtr !x1! set xx1=1
- if !xx2! gtr !x2! set xx2=1
- )
- pause
- :xx
- call echo.%%a%xx1%%%%%b%xx2%%%
复制代码
如果不强调顺序,可以直接:- @echo off
- for /f "delims=" %%a in (a.txt) do for /f "delims=" %%b in ('type b.txt') do echo.%%a%%b
- pause
复制代码
[ 本帖最后由 hanyeguxing 于 2010-4-24 14:09 编辑 ]
作者: lj84831253 时间: 2010-4-24 14:09
刚才百度了一下,了解了,我试试。
[ 本帖最后由 lj84831253 于 2010-4-24 14:12 编辑 ]
作者: lj84831253 时间: 2010-4-24 14:26
还是一样呀,,怎么办?你测试可以吗?
作者: lj84831253 时间: 2010-4-24 14:27
强调顺序的呵呵。
作者: lj84831253 时间: 2010-4-24 14:29
- @echo off & setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do set a%%a=%%b&set x1=%%a
- for /f "tokens=1* delims=:" %%a in ('type b.txt^|findstr /n .*') do set b%%a=%%b&set x2=%%a
- set /a x=!x1!*!x2!,xx1=1,xx2=1
- for /l %%a in (1 1 !x!) do (
- call :xx
- set/a xx1+=1,xx2+=1
- if !xx1! gtr !x1! set xx1=1
- if !xx2! gtr !x2! set xx2=1
- )
- pause
- :xx
- call echo.%%a%xx1%%%%%b%xx2%%%>> 1.txt
复制代码
导出1.txt后用删除重复行去检测结果还是一样。。。何解?
[ 本帖最后由 lj84831253 于 2010-4-24 14:30 编辑 ]
作者: lj84831253 时间: 2010-4-24 14:33
- @echo off & setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do set a%%a=%%b&set x1=%%a
- for /f "tokens=1* delims=:" %%a in ('type b.txt^|findstr /n .*') do set b%%a=%%b&set x2=%%a
- set /a x=!x1!*!x2!,xx1=1,xx2=1
- for /l %%a in (1 1 !x!) do (
- call :xx
- set/a xx1+=1,xx2+=1
- if !xx1! gtr !x1! set xx1=1
- if !xx2! gtr !x2! set xx2=1
- )
- pause
- :xx
- call echo.%%a%xx1%%%%%b%xx2%%%>> 1.txt
复制代码
导出1.txt后用删除重复行去检测结果还是一样。。。何解?
作者: hanyeguxing 时间: 2010-4-24 14:42
原帖由 lj84831253 于 2010-4-24 14:29 发表
导出1.txt后用删除重复行去检测结果还是一样。。。何解?
你没说清楚啊,别怕费事,多打俩字,把问题说清楚!
本身a、b文本不重复,输出的1就不可能有重复,为什么还要检查重复行呢?
如果想检查,也应该在a、b文本内检查。这样的操作是a+b行,而如果在1中检查,操作将是a*b行
[ 本帖最后由 hanyeguxing 于 2010-4-24 14:46 编辑 ]
作者: lj84831253 时间: 2010-4-24 14:49
原帖由 hanyeguxing 于 2010-4-24 14:42 发表
你没说清楚啊,别怕费事,多打俩字,把问题说清楚!
本身a、b文本不重复,输出的1就不可能有重复,为什么还要检查重复行呢?
如果想检查,也应该在a、b文本内检查。这样的操作最多增加a+b行,而如果在1中检查,操 ...
首先检测a.txt和b.txt是肯定没有重复的行,所以导出的1.txt应该也不会有重复的行对吗?可是如果你复制1.txt的第一行然后查找,就会发现有好几行跟第一行重复了。得到的正确结果应该是每一行都不相同啊,奇怪。。你可以看得明白吗?表达能力有限呵呵,
作者: lj84831253 时间: 2010-4-24 15:13
还在吗?我好郁闷啊。。。。崩溃。。。
作者: hanyeguxing 时间: 2010-4-24 15:14
假设a内容为:
A
B
C
D
b为:
1
2
你要怎么排列?
作者: lj84831253 时间: 2010-4-24 15:18
A1
B2
C1
D2
A1
B2
C1
D2啊?有重复行。
[ 本帖最后由 lj84831253 于 2010-4-24 15:19 编辑 ]
作者: lj84831253 时间: 2010-4-24 15:22
我明白了,如果是这样。a.txt:
A
B
C
b.txt:
1
2
3
4
这样就不会有重复行。
作者: lj84831253 时间: 2010-4-24 15:26
可是。。怎样找规律呢?什么情况下会有重复行,什么情况下不会有重复行,。。。难啊,,,,,,,我想砸电脑了呀,,,
作者: lj84831253 时间: 2010-4-24 15:33
原帖由 yangfengoo 于 2010-4-23 11:37 发表
@echo off & setlocal enabledelayedexpansion
for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do set a%%a=%%b&set x1=%%a
for /f "tokens=1* delims=:" %%a in ('findstr /n .* b.txt') do set b% ...
这样子说这段代码就不行了。。。
作者: hanyeguxing 时间: 2010-4-24 15:34
原帖由 lj84831253 于 2010-4-24 15:26 发表
可是。。怎样找规律呢?什么情况下会有重复行,什么情况下不会有重复行,。。。难啊,,,,,,,我想砸电脑了呀,,,
以4楼的代码为例,只有a、b文本的行数没有公约数时,才不会有重复行
A1、A2、B1、B2、C1、C2、D1、D2你到底打算怎么排列呢?
如果想不明白,就用我在16楼的第三个批处理吧
作者: lj84831253 时间: 2010-4-24 15:39
那能不能这样实现?当a、b文本的行数没有公约数时就按照四楼的方案做,如果有公约数时,假设内容容下:
a.txt:
A
B
C
D
b.txt:
1
2
3
4
则输出:
A1
B2
C3
D4
A2
B3
C4
D1
A3
B4
C1
D2
A4
B3
C2
D1
作者: hanyeguxing 时间: 2010-4-24 16:02
你没发现你给出的示例有重复吗?
作者: lj84831253 时间: 2010-4-24 16:10
原帖由 hanyeguxing 于 2010-4-24 16:02 发表
你没发现你给出的示例有重复吗?
啊。。。再次想砸电脑啊。。。。。。。。。。。。。看来只能用你这个了。。。:
- @echo off
- for /f "delims=" %%a in (a.txt) do for /f "delims=" %%b in ('type b.txt') do echo.%%a%%b
- pause
复制代码
但是这个顺序又不是我想要的。。。唉,,看来真的没办法了。。。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |