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

[文本处理] 批处理如何查找出A文本各行与B文本每一行相同的数字

本帖最后由 pcl_test 于 2016-7-6 11:43 编辑


a.txt内容为:
01 03 04 05 07 08 09 13
11 13 14 15 16 17 19 20
22 23 25 26 27 30 34 38

b.txt为:
01 02 03 04 05 06 13 14 20 27 30 34
01 02 03 04 05 07 13 14 20 27 32 38
05 06 08 11 15 18 19 21 22 29 36 38
05 06 08 11 15 18 19 21 24 29 38 42

两份文本内容均为升续
查找a.txt行的数字与b.txt行中有哪些是相同的,处理出来保存为3.txt

如:
a.txt第一行是 01 03 04 05 07 08 09 13
b.txt为:
01 02 03 04 05 06 13 14 20 27 30 34
01 02 03 04 05 07 13 14 20 27 32 38
05 06 08 11 15 18 19 21 22 29 36 38
05 06 08 11 15 18 19 21 24 29 38 42
那么b.txt行中与之相同的就是:
01 03 04 05 13
01 02 03 04 05 07 13
05 08
05 08

a.txt第二行是 11 13 14 15 16 17 19 20
b.txt为:
01 02 03 04 05 06 13 14 20 27 30 34
01 02 03 04 05 07 13 14 20 27 32 38
05 06 08 11 15 18 19 21 22 29 36 38
05 06 08 11 15 18 19 21 24 29 38 42
那么b.txt行中与之相同的就是:
13 14 20
13 14 20
11 15 19
11 15 19

a.txt第三行是 22 23 25 26 27 30 34 38
b.txt为:
01 02 03 04 05 06 13 14 20 27 30 34
01 02 03 04 05 07 13 14 20 27 32 38
05 06 08 11 15 18 19 21 22 29 36 38
05 06 08 11 15 18 19 21 24 29 38 42
那么b.txt行中与之相同的就是:
27 30 34
27 38
22 38
38

-------------------------------------------

a.txt:
01 03 04 05 07 08 09 13
11 13 14 15 16 17 19 20
22 23 25 26 27 30 34 38

b.txt:
01 02 03 04 05 06 13 14 20 27 30 34
01 02 03 04 05 07 13 14 20 27 32 38
05 06 08 11 15 18 19 21 22 29 36 38
05 06 08 11 15 18 19 21 24 29 38 42

所以a.txt与b.txt处理后得出的相同数字就是:
01 03 04 05 13
01 02 03 04 05 07 13
05 08
05 08
13 14 20
13 14 20
11 15 19
11 15 19
27 30 34
27 38
22 38
38

保存为3.txt

两个文件的列数是否固定?

TOP

回复 2# gawk


    你好,两个文件的列数为固定

TOP

  1. @echo off
  2. (for /f "delims=" %%a in (a.txt) do (
  3.   setlocal enabledelayedexpansion
  4.   for %%b in (%%a) do (
  5.     set/a n+=1
  6.     set .!n!=%%b
  7.   )
  8.   for /f "delims=" %%c in (b.txt) do (
  9.     for %%d in (%%c) do (
  10.       for /l %%e in (1 1 !n!) do (
  11.         if "%%d"=="!.%%e!" set "str=!str! %%d"
  12.       )
  13.     )
  14.     echo !str:~1!&set str=
  15.   )
  16.   endlocal
  17. ))>3.txt
复制代码

TOP

  1. @set @n=0//& cscript.exe -e:jscript "%~f0"& pause& exit/b
  2. a = 'a.txt';
  3. b = 'b.txt';
  4. fso = new ActiveXObject('Scripting.FileSystemObject');
  5. ts = fso.OpenTextFile(a);
  6. txt = fso.OpenTextFile(b).ReadAll();
  7. s = '';
  8. while(!ts.AtEndOfStream) {
  9.     ln = ts.ReadLine();
  10.     re = new RegExp('\\b(?:' + ln.replace(/ +/g,'|') + '|\r\n)\\b','g');
  11.     s += txt.match(re).join(' ') + '\r\n';
  12. }
  13. s = s.replace(/^ | $/gm,'').replace(/(?:\r\n){2,}/g,'\r\n');
  14. fso.OpenTextFile('c.txt', 2, true).Write(s);
复制代码

TOP

谢谢apang及powerbat 两位大哥提供的代码,特别是apang大哥一而再的帮助。

TOP

回复 4# apang

兄弟,你写的代码很多时候都很让人费解啊

比如这句    set .!n!=%%b

在!n!之前加一个小数点,是什么作用呢?

TOP

回复 7# poter

怎么会费解?你把小数点当成一般的字母看待就不会这么认为了。就像set A1=%%b,set A2=%%b等等;其中!n!为设置的变量值1,2,3,4。。。

TOP

本帖最后由 lvsehuaxue 于 2012-5-20 00:37 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3.    for %%a in (%%i) do (      
  4.       for /f "delims=" %%b in (b.txt) do (
  5.           set /a n+=1
  6.           for %%c in (%%b) do (
  7.               if %%a equ %%c call set "str!n!=%%str!n!%% %%a"
  8.           )                  
  9.       )
  10.       set n=      
  11.     )
  12.    for /l %%i in (1 1 4) do echo !str%%i!>>3.txt&set str%%i=
  13. )
复制代码

TOP

少点变量啦
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in (a.txt) do (
  3.      for /f "delims=" %%b in (b.txt) do (
  4.          for %%c in (%%a) do for %%d in (%%b) do if %%c equ %%d set str=!str! %%c
  5.          echo!str!&set str=
  6.      )
  7. ))>3.txt
  8. PAUSE
复制代码

TOP

回复 8# apang

哦,我懂了,原来是这个意思了。谢谢老哥

TOP

返回列表