Board logo

标题: [文本处理] 【已解决】BAT批处理怎样比较文件输出具有相同元素个数的行? [打印本页]

作者: battab    时间: 2013-12-27 18:09     标题: 【已解决】BAT批处理怎样比较文件输出具有相同元素个数的行?

本帖最后由 battab 于 2013-12-28 09:09 编辑

有两个文件:1.txt  2.txt
1.txt 的内容是:
a b c d e f g
h i j k l m n
a e k m o r

2.txt的内容是:
a b i j k c g
  
要求拿2.txt与1.txt比较,1.txt中可能有很多行.
输出内容保存在3.txt为: "4个元素相同的行:
                                     a b c d e f g
                                     3个元素相同的行:
                                     h i j k l m n
                                    2个元素相同的行:
                                    a e k m o r"

批处理可以做到吗?求教!
作者: apang    时间: 2013-12-27 19:13

本帖最后由 apang 于 2013-12-27 19:16 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. %1(for /f "tokens=*delims=0" %%a in ('"%~0" :^|sort /r')do echo,%%a)>3.txt &pause&exit /b
  3. set /p s=<2.txt
  4. for %%a in (%s%) do set ".%%a=1"
  5. for /f "delims=" %%a in (1.txt) do (
  6.     set "n="
  7.     for %%b in (%%a) do if defined .%%b set /a n+=1
  8.     if defined n set n=000!n!&echo,!n:~-4!个元素相同的行:%%a
  9. )
复制代码

作者: battab    时间: 2013-12-27 22:31

回复 2# apang
  效果达到,太帅了。
本人也就一菜鸟,很多地方看不懂,特别是几个for循环里的东东,更是看得一头雾水,apang大大能不能注释解说一下。
作者: apang    时间: 2013-12-28 10:53

回复 3# battab


    简单注释下,有些语句只能意会,不能言传。
  1. @echo off & setlocal enabledelayedexpansion
  2. %1(for /f "tokens=*delims=0" %%a in ('"%~0" :^|sort /r')do echo,%%a)>3.txt &pause&exit /b
  3. Rem 开启新进程运行批处理自身,把":"作为参数传递给%1,新进程不会运行这一行。
  4. Rem 作用是删除行首重复0,并逆序输出到3.txt
  5. set /p s=<2.txt
  6. Rem 将2.txt第一行赋值给变量s
  7. for %%a in (%s%) do set ".%%a=1"
  8. Rem 假设s值为a b c d,就将变量.a .b .c .d分别赋值为1
  9. for /f "delims=" %%a in (1.txt) do (
  10. Rem 循环读取1.txt每一行
  11.     set "n="
  12.     Rem 赋值变量n为空值
  13.     for %%b in (%%a) do if defined .%%b set /a n+=1
  14.     Rem 假设%%a值为a b c 0,因为.a .b .c值均为1,而.0值为空,所以n=3
  15.     if defined n set n=000!n!&echo,!n:~-4!个元素相同的行:%%a
  16.     Rem 如果n值非空(n=3),则显示:0003个元素相同的行:a b c 0
  17. )
复制代码

作者: battab    时间: 2013-12-28 11:54

回复 4# apang


    THANKS!
作者: PowerShell    时间: 2013-12-28 12:25

本帖最后由 PowerShell 于 2013-12-28 12:27 编辑

-------------------点评:------------------
好!
Rem 假设s值为a b c d,就将变量.a .b .c .d分别赋值为1
Rem 假设%%a值为a b c 0,因为.a .b .c值均为1,而.0值为空,所以n=3


这个问题可以变成这样:如何取2个数组的合集?
答:按位与。
即 2个数组相同元素都为1,则结果为1,否则为0,最后把结果按位相加即可。

在powershell中有下列关键字用来计算:
-band        位与
-bor                位或
-bxor        位异或
作者: binghejin    时间: 2013-12-28 14:41

你是打算做一个彩票分析软件吗?呵呵!
作者: battab    时间: 2013-12-30 21:04

回复 7# binghejin


难道你是彩迷?   




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