中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-15 12:28
47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行
DOS批处理 & 脚本技术(批处理室) » 如何分离出以下两个文件中不同的内容
可打印版本  2,972 / 12
第1楼 xxniao 发表于 2006-02-28 04:50
初级用户 发帖 23 积分 66 来自 浙江
如何分离出以下两个文件中不同的内容
A文件.txt

123456.exe
abcdef.exe
zghcge.exe

B文件.txt
123456.exe
abcdef.exe
zghcge.exe
aaaaaa.exe
cccccc.exe
dddddd.exe

将A和B文件对比分离出以下不相同的内容
aaaaaa.exe
cccccc.exe
dddddd.exe

请高手赐教。。。。。
第2楼 3742668 发表于 2006-02-28 08:27
荣誉版主 发帖 718 积分 2,013
findstr /v /g:a.txt b.txt
XP专业版,SP2下测试通过。。
当然你也可以用for来循环。。
第3楼 xxniao 发表于 2006-02-28 12:16
初级用户 发帖 23 积分 66 来自 浙江
好像二楼的答案离题了吧!!
用 findsrv 是用来查找的啊,而不是比较吧!!
第4楼 xxniao 发表于 2006-02-28 12:21
初级用户 发帖 23 积分 66 来自 浙江
能不能说说用FOR如何来实现吗?
第5楼 3742668 发表于 2006-02-28 15:56
荣誉版主 发帖 718 积分 2,013
Originally posted by xxniao at 2006-2-28 12:16:
好像二楼的答案离题了吧!!
用 findsrv 是用来查找的啊,而不是比较吧!!


离题?
你自己好好看看你自己出的题 : 如何分离出以下两个文件中不同的内容
另外哪个规定findstr(不是findstv)只能用来查找?你要查找你去用FC和COMP去好了。
用最简单的方法实现想实现的功能就可以了,是不是不用for,不够麻烦就不算正解呢?建议你去学汇编去,用汇编来实现这个功能。。。
第6楼 willsort 发表于 2006-02-28 16:40
元老会员 发帖 1,512 积分 4,432
Re 3742668:

兄的方法确实有效,然而此方法仅仅适用于b完全包含a中所有文本的情况,如果a中有b中不存在的文本行,那么这些行将不会记入输出结果;而如果文件a包含了文件b,则搜索结果将为空。

另外,此方案要求a的体积不能过于庞大,否则将十分影响搜索的效率。同时a的文本行不能过于复杂,否则搜索将会出现错误结果。

批处理删除XP输入法问题!请dos高手解决
http://www.cn-dos.net/forum/viewthread.php?tid=19084
第7楼 3742668 发表于 2006-02-28 19:14
荣誉版主 发帖 718 积分 2,013
呵呵,版主就是版主,看问题果然有深度。不过,如果你看了楼主前面发的帖子就可以大致了解到他要实现的功能可以就用我上面的那个功能完成。其实我认为只要能达到目的,用什么命令无所谓,不一定非要用for命令才显得水平高,有深度。下面是我最开始的版本,只不过想想没那么麻烦就一句findstr搞定,可惜楼主连试都没试,还弄了个findsrv出来。。。
@echo off
copy 1.txt a.txt
copy 2.txt b.txt
:find
set a=
set /p a=<a.txt
if "%a%" == "" goto end
findstr /v "%a%" a.txt > tmp.txt
type tmp.txt > a.txt
findstr /v "%a%" b.txt> tmp.txt
type tmp.txt >b.txt
goto find

:end
echo y | del a.txt
echo y | del b.txt
第8楼 3742668 发表于 2006-02-28 19:27
荣誉版主 发帖 718 积分 2,013
Originally posted by willsort at 2006-2-28 16:40:
Re 3742668:

兄的方法确实有效,然而此方法仅仅适用于b完全包含a中所有文本的情况,如果a中有b中不存在的文本行,那么这些行将不会记入输出砮..


看了这段话是吃也吃不好,睡也睡不好,苦思冥想终于凑了一篇出来,望willsort指正:
@echo off
if exist 1和2都有.txt echo y | del 1和2都有.txt
if exist 1有2没有.txt echo y | del 1有2没有.txt
if exist 2有1没有.txt echo y | del 2有1没有.txt
copy 1.txt tmp.txt

:same
set a=
set /p a=<tmp.txt
if "%a%" == "" goto different
findstr /v %a% tmp.txt > temp.txt
type temp.txt >tmp.txt
findstr %a% 2.txt >>tmp1.txt
goto same

:different
findstr /v /g:tmp1.txt 1.txt >1有2没有.txt
findstr /v /g:tmp1.txt 2.txt >2有1没有.txt

:end
ren tmp1.txt 1和2都有.txt
echo y | del tmp.txt
echo y | del temp.txt


ps:本来自认为算是比较精益求精,追求完美的人了,但是与兄相比,惭愧之至啊

[ Last edited by 3742668 on 2006-3-1 at 16:41 ]
第9楼 tigerpower 发表于 2006-02-28 22:51
中级用户 发帖 99 积分 377
还有一种情况是:同样的一行,A文件中有m行,而B文件中有n行(m!=n)。
要是提取出来的文件能反映这种情况就更完美了
第10楼 xxniao 发表于 2006-03-01 02:47
初级用户 发帖 23 积分 66 来自 浙江
晕了,各位啊,对不起啊,,我这人技术实在是太差了,
刚刚上面兄弟说的用其它语言来实现,其实其它语言实现那是很简单的啊,
只是我现在就想用纯批处理啊,,, 其实你们说的很多东西我都不是很明白,
如果有得罪的地方请多多包含。
第11楼 3742668 发表于 2006-03-01 16:55
荣誉版主 发帖 718 积分 2,013
Originally posted by tigerpower at 2006-2-28 22:51:
还有一种情况是:同样的一行,A文件中有m行,而B文件中有n行(m!=n)。
要是提取出来的文件能反映这种情况就更完美了


呵呵,谢谢提醒。实现其实不难,根据最后的 "1和2都有.txt" 和findstr 是可以了实现的,加上/n参数连在第几行都找得出.
第12楼 willsort 发表于 2006-03-02 17:17
元老会员 发帖 1,512 积分 4,432
Re xxniao:

以上给出的所有方案代码都是使用“纯批处理”实现的,可在 NTCMD 下独立运行。

是我过去做过的一个比较目录文件的批处理,也许与楼主的要求有些相近。

Re 3742668:

8楼的逐行查找的方案确可解决大体积文本的比较。但是复杂文本(如含有字符串 %\_ 的文件)的比较仍有研究。暂时发现的问题是,findstr 行中的 %a% 需要加引号,避免比较含空格行时出错。

Re tigerpower:

你的问题似可用 "findstr /g:1.txt 2.txt >1和2都有.txt" 解决,未经测试。

CompDir.cmd - Compare files in two directories.


1.txt


2.txt
第13楼 tigerpower 发表于 2006-03-02 20:24
中级用户 发帖 99 积分 377
willsort真不愧为板主,那些特殊情况偶是想都没想到。
还有一种解法是使用 comm :

@echo off
sort 1.txt>1__.txt
sort 2.txt>2__.txt
for %%i in (__ "" -1 -2) do comm 1.txt 2.txt %%i>result_%%i.txt
del *__.txt
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023