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

[文本处理] 【已解决】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"

批处理可以做到吗?求教!
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
学习中

本帖最后由 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. )
复制代码
1

评分人数

TOP

回复 2# apang
  效果达到,太帅了。
本人也就一菜鸟,很多地方看不懂,特别是几个for循环里的东东,更是看得一头雾水,apang大大能不能注释解说一下。
学习中

TOP

回复 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. )
复制代码

TOP

回复 4# apang


    THANKS!
学习中

TOP

本帖最后由 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        位异或
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

你是打算做一个彩票分析软件吗?呵呵!

TOP

回复 7# binghejin


难道你是彩迷?   
学习中

TOP

返回列表