中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-06 22:27
48,039 主题排行 / 350,124 发帖 / 今日 0 篇 / 48,252 会员排行
DOS批处理 & 脚本技术(批处理室) » 比较两个千行以上TXT的差异行
可打印版本  1,947 / 20
第1楼 pillow 发表于 2007-12-12 15:56
初级用户 发帖 82 积分 196
比较两个千行以上TXT的差异行
搜“删除行”只查到下面这一个帖子

求一个删除行的批处理
http://www.cn-dos.net/forum/viewthread.php?tid=23894&pid=245486&page=1&sid=WvtvSg#pid245486

前提条件:
两个TXT文件,分别有5000行+(命名为A)和2000行+(命名为B),只有一列,内容为计算机名。

我要处理的问题有点极端,需要将A文件中有而B文件中没有的行比较出来。目前想到的方式只有从A中逐条删除B中的记录,这若是搜到的方式岂不是要生成几千个文件?(那个方式若针对单行删除和小文件倒真的是超好的方法)
而且似乎也谈不上效率了,请问哪位知道有没有用P处理的更好思路?

PS:现在有点想钻牛角头,只想用P,不想再装SQL什么的那么麻烦了。
第2楼 dooomer 发表于 2007-12-12 16:17
初级用户 发帖 52 积分 109
fc?
第3楼 pillow 发表于 2007-12-12 16:24
初级用户 发帖 82 积分 196
……
咣,忘了这个东西了。
不过印象中它比较的文件好像不能超过多少行来着……
去试试先
第4楼 lxmxn 发表于 2007-12-12 16:42
版主 发帖 4,938 积分 11,386
fc、findstr、awk……
第5楼 terse 发表于 2007-12-12 16:51
银牌会员 发帖 946 积分 2,404
这样行不?

也可以这样:
@echo off
for /f "delims=" %%a in (a.txt) do findstr /i %%a b.txt >nul 2>nul|| echo %%a>>c.txt

[ Last edited by terse on 2007-12-12 at 05:54 PM ]
第6楼 knoppix7 发表于 2007-12-12 19:08
银牌会员 发帖 634 积分 1,287 来自 cmd.exe
GAWK
第7楼 junchen2 发表于 2007-12-12 23:36
高级用户 发帖 219 积分 537 来自 杭州--半山
awk "NR==FNR{computername_b[$0]=$0};NR>FNR{if($0 in computername_b){} else {print $0}}" b.txt a.txt
第8楼 pillow 发表于 2007-12-13 00:38
初级用户 发帖 82 积分 196
首先感谢各位的帮忙!
刚才试了5楼 code,
运行期间CPU usage 100%, A文件5200+,B文件2300+,执行时间11分钟。

awk快忘光了,今撑不住啦,明天测了再告诉大家结果~~
第9楼 tao0610 发表于 2007-12-13 10:43
高级用户 发帖 218 积分 579
第10楼 pillow 发表于 2007-12-13 13:22
初级用户 发帖 82 积分 196
才發現我這個AWK的入門者目前還不能讀懂7樓 code,但還是要感謝junchen2,我再去充一下電,爭取晚上回復結果。

更要感謝9樓tao0610,只要2秒就出結果,code超級有效率!
第11楼 ZJHJ 发表于 2007-12-16 21:33
高级用户 发帖 374 积分 609
Originally posted by tao0610 at 2007-12-13 10:43:




文件大了根本无法执行
第12楼 terse 发表于 2007-12-16 23:10
银牌会员 发帖 946 积分 2,404
Originally posted by ZJHJ at 2007-12-16 21:33:


文件大了根本无法执行


根据你的意思 你应该试一下:findstr /vg:b.txt a.txt>c.txt
第13楼 pillow 发表于 2007-12-17 08:28
初级用户 发帖 82 积分 196
12楼讲的对,确实有tao0610在9楼提供代码中a.txt, b.txt的位置互换,因为B才是search string。
第14楼 ZJHJ 发表于 2007-12-17 23:58
高级用户 发帖 374 积分 609
Originally posted by terse at 2007-12-16 23:10:


根据你的意思 你应该试一下:findstr /vg:b.txt a.txt>c.txt



我看你们也没有试过!

如果你按"修改时间"记录你机器中所有分区的 exe、dll、inf 文件及路径,不包括*.*

大致有8000行左右.

你复制一份并修改内容作为a或b,

看看c.txt 中有没有就知道了? 看看会告诉你什么?

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

我是将无病毒、无木马的系统,包括所有分区的 exe 、dll、 inf 文件按"修改时

间"文件大小及路径记录。如果文件被感染,"修改时间"和文件大小必然被修改,

a、b两个文件各有7000-10000行,大小各500k-1M,要比较a、b两个文件的差

异行,其实我的要求比楼主还要高,既要差异行,也要原始行,还要新增行。并

且差异行、原始行要排在一起(决对不能错位),新增行单独。显示要洁净明了。

如果用上面的方法根本无法完成,用fc显示实在太乱,也无法查看。我写了几K的

p才算完成。(当然越简单越好了)
第15楼 everest79 发表于 2007-12-18 00:31
金牌会员 发帖 1,127 积分 2,564
to ZJHJ

我试了,没问题
for /l %i in (1,1,50000) do echo test:\\//\\//abcedfghijklmnopqrstuvwxyz%i>>A.txt
copy a.txt b.txt
findstr /xg:b.txt a.txt >c.txt
你在findstr /vxg:b.txt a.txt >c.txt这个命令中看不到c.txt的内容,那是因为你的源文件与目标文件是相同的
windows nt的一个变量都可以达到1024Kb
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023