[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理怎样对两个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 编辑 ]
1

评分人数

    • Batcher: 感谢主动给标题标注[已解决]字样PB + 2

  1. paste -d " " 1.txt 2.txt >3.txt
复制代码
1

评分人数

TOP

我的不是linux系统! 是xp系统。。。

TOP

1。新建一个 EXCEL 文档;
2。全选 1.txt 的内容,复制,选中EXCEL第一行一列的单元格,粘贴;
3。全选 2.txt 的内容,复制,选中EXCEL第一行二列的单元格,粘贴;
4。选中EXCEL的第一列和第二列,复制;
5。新建文本文档,粘贴;

(6。如果需要把TAB分隔符替换为空格,可以复制一个TAB制表符,编辑,替换,全部替换。)

TOP

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
复制代码
1

评分人数

寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 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 编辑 ]
技术问题请到论坛发帖求助!

TOP

回复 3楼 的帖子

可以去下载一个paste.exe
http://bbs.bathome.net/thread-1114-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

  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的行,两个不相等的情况下输出行数最少的。你也没说如果两个不相同该怎样办,就只好这样了
1

评分人数

努力学习,努力挣分

TOP

必须行对行强行匹配。每读一行a,必须对b强行读取相应行并终止。

楼上的可行,但是如果有几百行或更多,效率是个问题。
用sed可以做到。1 要行对行穿插。 2  奇偶行合并。同样存在效率问题。

TOP

9楼:
你能否贴一个用sed实现楼主需求的代码出来看看?

TOP

那就用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);
复制代码
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

谢谢大家方法,问题解决了。。。

TOP

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 编辑 ]

TOP

to 13楼:
这种问题一般不用sed吧,用gawk会效率高些。

TOP

一般不到万不得已,我都不会用三方。

TOP

返回列表