标题: [文本处理] [已解决]批处理怎样对两个txt内容进行特殊的合并? [打印本页]
作者: wo2007 时间: 2010-6-18 17:05 标题: [已解决]批处理怎样对两个txt内容进行特殊的合并?
如1.txt的内容为
xxxxx/id=123
xxxxx/id=113
xxxxx/id=125
xxxxx/id=12
xxxxx/id=17
xxxxx/id=228
xxxxx/id=129
2.txt的内容
也许得wen
谁是大叔
哈师大是
撒的撒旦
实打实
是防守打法
发生的撒旦
怎样合并为以下呢?
xxxxx/id=123 也许得wen
xxxxx/id=113 谁是大叔
xxxxx/id=125 哈师大是
xxxxx/id=12 撒的撒旦
xxxxx/id=17 实打实
xxxxx/id=228 是防守打法
xxxxx/id=129 发生的撒旦
我写了段但行不通
cls
@echo off
for /f "eol= tokens=1 delims= " %%i in (1.txt) do (
for /f "eol= tokens=1 delims= " %%j in (2.txt) do echo %%i %%j>>3.txt
)
运行了结果3.txt如下:
xxxxx/id=123 也许得wen
xxxxx/id=123 谁是大叔
xxxxx/id=123 哈师大是
xxxxx/id=123 撒的撒旦
xxxxx/id=123 实打实
xxxxx/id=123 是防守打法
xxxxx/id=123 发生的撒旦
xxxxx/id=113 也许得wen
xxxxx/id=113 谁是大叔
xxxxx/id=113 哈师大是
xxxxx/id=113 撒的撒旦
xxxxx/id=113 实打实
xxxxx/id=113 是防守打法
xxxxx/id=113 发生的撒旦
xxxxx/id=125 也许得wen
xxxxx/id=125 谁是大叔
xxxxx/id=125 哈师大是
xxxxx/id=125 撒的撒旦
xxxxx/id=125 实打实
xxxxx/id=125 是防守打法
xxxxx/id=125 发生的撒旦
xxxxx/id=12 也许得wen
xxxxx/id=12 谁是大叔
xxxxx/id=12 哈师大是
xxxxx/id=12 撒的撒旦
xxxxx/id=12 实打实
xxxxx/id=12 是防守打法
xxxxx/id=12 发生的撒旦
xxxxx/id=17 也许得wen
xxxxx/id=17 谁是大叔
xxxxx/id=17 哈师大是
xxxxx/id=17 撒的撒旦
xxxxx/id=17 实打实
xxxxx/id=17 是防守打法
xxxxx/id=17 发生的撒旦
xxxxx/id=228 也许得wen
xxxxx/id=228 谁是大叔
xxxxx/id=228 哈师大是
xxxxx/id=228 撒的撒旦
xxxxx/id=228 实打实
xxxxx/id=228 是防守打法
xxxxx/id=228 发生的撒旦
xxxxx/id=129 也许得wen
xxxxx/id=129 谁是大叔
xxxxx/id=129 哈师大是
xxxxx/id=129 撒的撒旦
xxxxx/id=129 实打实
xxxxx/id=129 是防守打法
xxxxx/id=129 发生的撒旦
重复而且乱位了。。。不知大家有什么高招?能帮下不?
[ 本帖最后由 wo2007 于 2010-6-19 08:44 编辑 ]
作者: CUer 时间: 2010-6-18 17:48
- paste -d " " 1.txt 2.txt >3.txt
复制代码
作者: wo2007 时间: 2010-6-18 17:59
我的不是linux系统! 是xp系统。。。
作者: Spring 时间: 2010-6-18 18:24
1。新建一个 EXCEL 文档;
2。全选 1.txt 的内容,复制,选中EXCEL第一行一列的单元格,粘贴;
3。全选 2.txt 的内容,复制,选中EXCEL第一行二列的单元格,粘贴;
4。选中EXCEL的第一列和第二列,复制;
5。新建文本文档,粘贴;
(6。如果需要把TAB分隔符替换为空格,可以复制一个TAB制表符,编辑,替换,全部替换。)
作者: hanyeguxing 时间: 2010-6-18 18:34
1,行首不能为:
2,不忽略空行
3,不能有=字符- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* 1.txt') do set "#%%a=%%b"
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* 2.txt') do echo.!#%%a! %%b)>3.txt
复制代码
作者: 随风 时间: 2010-6-18 19:10 标题: 回复 1楼 的帖子
文件不太大的话就牺牲点效率吧 ^_^
b.txt 行数不能比a.txt行数多,否则会导致数据丢失
:- @echo off
- set /a n=-1
- cd.>c.txt
- for /f "delims=" %%a in (a.txt) do call :loop "%%a"
- start c.txt
- exit
- :loop
- set /a n+=1
- if %n% equ 0 (set skip=) else set "skip=skip=%n%"
- for /f "%skip% delims=" %%b in (b.txt) do echo %~1 %%b>>c.txt
- goto :EOF
复制代码
[ 本帖最后由 随风 于 2010-6-18 19:11 编辑 ]
作者: Batcher 时间: 2010-6-18 20:50 标题: 回复 3楼 的帖子
可以去下载一个paste.exe
http://bbs.bathome.net/thread-1114-1-1.html
作者: sgaizxt001 时间: 2010-6-18 20:58
- @echo off
- for /f "tokens=1,* delims=:" %%a in ('findstr /n .* a.txt') do (
- for /f "tokens=1,* delims=:" %%c in ('findstr /n .* b.txt') do (
- if %%c equ %%a (echo %%b %%d >>c.txt)
- )
- )
复制代码
b.txt的行匹配a.txt的行,两个不相等的情况下输出行数最少的。你也没说如果两个不相同该怎样办,就只好这样了
作者: ZJHJ 时间: 2010-6-18 22:09
必须行对行强行匹配。每读一行a,必须对b强行读取相应行并终止。
楼上的可行,但是如果有几百行或更多,效率是个问题。
用sed可以做到。1 要行对行穿插。 2 奇偶行合并。同样存在效率问题。
作者: CUer 时间: 2010-6-18 22:47
9楼:
你能否贴一个用sed实现楼主需求的代码出来看看?
作者: zqz0012005 时间: 2010-6-19 02:09
那就用js脚本吧- var fso, a1, a2, l1, l2, min, s, i;
- fso = new ActiveXObject("Scripting.FileSystemObject");
- a1=fso.OpenTextFile("1.txt").ReadAll().replace(/\r\n$/,'').split('\r\n');
- a2=fso.OpenTextFile("2.txt").ReadAll().replace(/\r\n$/,'').split('\r\n');
- l1=a1.length;
- l2=a2.length;
- min = (l1 < l2) ? (l1) : (l2);
- s='';
- i=0;
- for (i=0; i<min; i++)
- {
- s += a1[i] + ' ' + a2[i] + '\r\n';
- }
- //one of the following loops won't run, so 'i' is safe.
- for (; i<l1; i++)
- {
- s += a1[i] + '\r\n';
- }
- for (; i<l2; i++)
- {
- s += a2[i] + '\r\n';
- }
-
- fso.OpenTextFile("join.txt",2,true).Write(s);
复制代码
作者: wo2007 时间: 2010-6-19 08:42
谢谢大家方法,问题解决了。。。
作者: ZJHJ 时间: 2010-6-19 10:56
rd 10楼
因为我在编写任意十六进制码解密还原时就必须要用这样的命令,所以做过比较。
sed 要牺牲234K空间,处理这个问题效率也不是很特别。大家可以比较一下速度。
@echo off
for /f "delims=" %%i in (a.txt) do set /a ax+=1
for /f "delims=" %%i in (b.txt) do set /a bx+=1
if %ax% LSS %bx% set ax=%bx%
:fh
set /a n+=1
sed -n %n%p a.txt>>tmp.txt
sed -n %n%p b.txt>>tmp.txt
if %n% LSS %ax% goto :fh
more +1 tmp.txt>tmpz.txt
sed -e "N;s/\n//" tmpz.txt>>c.txt
del tmp.txt
del tmpz.txt
-------------------------------
@echo off
setlocal EnableDelayedExpansion
set/a n=-1
for /f "delims=" %%a in (a.txt) do (
set/a n+=1
call :mp "%%a" )
goto :ef
:mp
if !n! equ 0 for /f "delims=" %%i in (b.txt) do echo %%a%%i>>ba.txt&goto:eof
if not !n! equ 0 for /f "skip=%n% delims=" %%i in (b.txt) do echo %%a%%i>>ba.txt&goto:eof
[ 本帖最后由 ZJHJ 于 2010-6-19 11:24 编辑 ]
作者: CUer 时间: 2010-6-19 12:45
to 13楼:
这种问题一般不用sed吧,用gawk会效率高些。
作者: ZJHJ 时间: 2010-6-19 13:55
一般不到万不得已,我都不会用三方。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |