Board logo

标题: [文本处理] [已解决] 批处理如何合并两个文本? [打印本页]

作者: xudaweb    时间: 2011-12-6 09:10     标题: [已解决] 批处理如何合并两个文本?

本帖最后由 xudaweb 于 2011-12-13 08:18 编辑

合并要求:
两个文本的行数一样,需要按相同行进行合并。

A文本内容如下:
  1. 1:c124e04
  2. 2:c147db4
  3. 3:c1500a4
  4. 4:c1500a1
  5. 5:c147db1
复制代码
B文本内容如下:
  1. 1100-B
  2. 1307-C
  3. 1107-B
  4. 1124-H
  5. 1126-F
复制代码
需要批处理得到:
  1. 1:c124e04:1100-B
  2. 2:c147db4:1307-C
  3. 3:c1500a4:1107-B
  4. 4:c1500a1:1124-H
  5. 5:c147db1:1126-F
复制代码

作者: xudaweb    时间: 2011-12-6 09:36

本帖最后由 xudaweb 于 2011-12-6 09:38 编辑

改了下别人的代码,就是有点不太明白具体执行原理,谁能详细解释下?
  1. (for /f "delims=" %%a in ('findstr  .* A.txt') do (
  2.   set "a=%%a"
  3.   setlocal enabledelayedexpansion
  4.   set /p b=
  5.   echo !a!:!b!
  6.   endlocal
  7. ))<B.txt>C.txt
  8. pause>nul&exit
复制代码
大家还有什么别的思路么?
作者: xudaweb    时间: 2011-12-6 09:45

又发现一种方法,还是不懂具体执行原理。
  1. findstr /n .* B.txt>tmp1
  2. find /n /v "" <A.txt>tmp2
  3. (for /f "tokens=2*delims=]:" %%a in ('fc /lb1000 /n tmp1 tmp2^|sort') do (
  4.    if not defined . (
  5.       set /p=%%b<nul
  6.       set .=.
  7.    ) else (
  8.       set .=
  9.       echo;:%%b
  10.    )
  11. ))>C.txt
  12. del /q tmp?
  13. pause
复制代码

作者: rat    时间: 2011-12-6 10:30

2L可以再简化下
  1. @echo off
  2. (for /f "delims=" %%a in (A.txt) do (
  3.   set /p b=
  4.   call echo %%a:%%b%%
  5. ))<B.txt>C.txt
  6. pause>nul
复制代码

作者: bluewing009    时间: 2011-12-6 11:31

是行号对应关系么?就是这边第一行和那边的第一行?
作者: Hello123World    时间: 2011-12-6 12:53

  1. @echo off&SetLocal EnableDelayedExpansion
  2. For /f "delims=: tokens=1*" %%i in ('findstr /n ".*" a.txt') do set _%%i=%%j
  3. (For /f "delims=: tokens=1*" %%i in ('findstr /n ".*" b.txt') do (
  4. Set n=%%i
  5. Call echo %%_!n!%%:%%j
  6. ))>c.txt
  7. start c.txt
  8. pause&exit
复制代码

作者: xudaweb    时间: 2011-12-6 13:16

给位都解释解释这几个代码,是怎么执行的。。。
作者: CrLf    时间: 2011-12-6 14:05

回复 7# xudaweb


    2 楼代码是分别取来自 for 的输入和来自重定向的输入再同时输出。
http://bbs.bathome.net/thread-13327-1-1.html
    3 楼代码是先给两个文本加行号,再 fc 比较(一个永远也不可能相等的逐行比较),以便使两个文本以交错行的形式出现,再合并奇偶行
http://bbs.bathome.net/redirect. ... 4&fromuid=30406
    6 楼代码是将 a.txt 的每行各定义为一个变量,以行号为变量名,读取另一个文本时再逐行获取当前行号对应的变量。
出处不明,提供两个相关链接:
http://bbs.bathome.net/thread-1239-1-2.html
http://bbs.bathome.net/viewthread.php?tid=4690
作者: 545810831    时间: 2011-12-6 17:42

  1. @echo off&setlocal enabledelayedexpansion
  2. set txt=a.txt&call :sta
  3. set txt=b.txt&call :sta
  4. pause
  5. :sta
  6. set /a n+=1
  7. set m=0
  8. for /f "delims=" %%i in (!txt!) do (
  9. set /a m+=1
  10. set  "_!n!!m!=%%i"
  11. if !n! equ 2 call echo %%_1!m!%%:%%_2!m!%%
  12. )
  13. goto :eof
复制代码

作者: awk    时间: 2011-12-6 17:52

  1. paste -d ":" a.txt b.txt >c.txt
复制代码

作者: 920168    时间: 2011-12-13 10:55

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set n1=0
  4. for /f "delims=" %%a in (1.txt) do (
  5. set /a n1=n1+1
  6. set n2=0
  7. for /f "delims=" %%b in (2.txt) do (
  8. set /a n2=n2+1
  9. if !n1! equ !n2! (
  10. echo %%a:%%b>>c.txt
  11. )
  12. )
  13. )
  14. pause
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2