Board logo

标题: [文本处理] [已解决]批处理怎样对两个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

  1. 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,不能有=字符
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1* delims=:" %%a in ('findstr /n .* 1.txt') do set "#%%a=%%b"
  3. (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行数多,否则会导致数据丢失
:
  1. @echo off
  2. set /a n=-1
  3. cd.>c.txt
  4. for /f "delims=" %%a in (a.txt) do call :loop "%%a"
  5. start c.txt
  6. exit
  7. :loop
  8. set /a n+=1
  9. if %n% equ 0 (set skip=) else set "skip=skip=%n%"
  10. for /f "%skip% delims=" %%b in (b.txt) do echo %~1 %%b>>c.txt
  11. 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

  1. @echo off
  2. for /f "tokens=1,* delims=:" %%a in ('findstr /n .* a.txt') do (
  3. for /f "tokens=1,* delims=:" %%c in ('findstr /n .* b.txt') do (
  4.    if %%c equ %%a (echo %%b %%d >>c.txt)
  5. )
  6. )
复制代码
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脚本吧
  1. var fso, a1, a2, l1, l2, min, s, i;
  2. fso = new ActiveXObject("Scripting.FileSystemObject");
  3. a1=fso.OpenTextFile("1.txt").ReadAll().replace(/\r\n$/,'').split('\r\n');
  4. a2=fso.OpenTextFile("2.txt").ReadAll().replace(/\r\n$/,'').split('\r\n');
  5. l1=a1.length;
  6. l2=a2.length;
  7. min = (l1 < l2) ? (l1) : (l2);
  8. s='';
  9. i=0;
  10. for (i=0; i<min; i++)
  11. {
  12.     s += a1[i] + ' ' + a2[i] + '\r\n';
  13. }
  14. //one of the following loops won't run, so 'i' is safe.
  15. for (; i<l1; i++)
  16. {
  17.     s += a1[i] + '\r\n';
  18. }
  19. for (; i<l2; i++)
  20. {
  21.     s += a2[i] + '\r\n';
  22. }
  23. 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://bathome.net./) Powered by Discuz! 7.2