标题: 比较两个千行以上TXT的差异行
[打印本页]
作者: pillow
时间: 2007-12-12 15:56
标题: 比较两个千行以上TXT的差异行
搜“删除行”只查到下面这一个帖子
求一个删除行的批处理
http://www.cn-dos.net/forum/view ... id=WvtvSg#pid245486
前提条件:
两个TXT文件,分别有5000行+(命名为A)和2000行+(命名为B),只有一列,内容为计算机名。
我要处理的问题有点极端,需要将A文件中有而B文件中没有的行比较出来。目前想到的方式只有从A中逐条删除B中的记录,这若是搜到的方式岂不是要生成几千个文件?(那个方式若针对单行删除和小文件倒真的是超好的方法)
而且似乎也谈不上效率了,请问哪位知道有没有用P处理的更好思路?
PS:现在有点想钻牛角头,只想用P,不想再装SQL什么的那么麻烦了。
作者: dooomer
时间: 2007-12-12 16:17
fc?
作者: pillow
时间: 2007-12-12 16:24
……
咣,忘了这个东西了。
不过印象中它比较的文件好像不能超过多少行来着……
去试试先
作者: lxmxn
时间: 2007-12-12 16:42
fc、findstr、awk……
作者: terse
时间: 2007-12-12 16:51
这样行不?
@echo off
for /f "delims=" %%a in (a.txt) do (
findstr /i %%a b.txt
if errorlevel 1 echo %%a>>c.txt
)
也可以这样:
@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 ]
作者: knoppix7
时间: 2007-12-12 19:08
GAWK
作者: junchen2
时间: 2007-12-12 23:36
awk "NR==FNR{computername_b[$0]=$0};NR>FNR{if($0 in computername_b){} else {print $0}}" b.txt a.txt
作者: pillow
时间: 2007-12-13 00:38
首先感谢各位的帮忙!
刚才试了5楼 code,
运行期间CPU usage 100%, A文件5200+,B文件2300+,执行时间11分钟。
awk快忘光了,今撑不住啦,明天测了再告诉大家结果~~
作者: tao0610
时间: 2007-12-13 10:43
findstr /vxg:a.txt b.txt
作者: pillow
时间: 2007-12-13 13:22
才發現我這個AWK的入門者目前還不能讀懂7樓 code,但還是要感謝junchen2,我再去充一下電,爭取晚上回復結果。
更要感謝9樓tao0610,只要2秒就出結果,code超級有效率!
作者: ZJHJ
时间: 2007-12-16 21:33
Quote: |
Originally posted by tao0610 at 2007-12-13 10:43:
findstr /vxg:a.txt b.txt |
|
文件大了根本无法执行
作者: terse
时间: 2007-12-16 23:10
Quote: |
Originally posted by ZJHJ at 2007-12-16 21:33:
文件大了根本无法执行 |
|
根据你的意思 你应该试一下:findstr /vg:b.txt a.txt>c.txt
作者: pillow
时间: 2007-12-17 08:28
12楼讲的对,确实有tao0610在9楼提供代码中a.txt, b.txt的位置互换,因为B才是search string。
作者: ZJHJ
时间: 2007-12-17 23:58
Quote: |
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才算完成。(当然越简单越好了)
作者: everest79
时间: 2007-12-18 00:31
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
作者: ZJHJ
时间: 2007-12-18 10:05
Quote: |
Originally posted by everest79 at 2007-12-18 00:31:
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. ... |
|
我的a.txt有544k,8100行. b.txt是a.txt复制并修改或增加一些内容,目的就是要
检查出被修改或增加的内容,所以a、b文件是不同的。
用你的方法同样是什么也没有。
(系统xp sp2)
作者: ZJHJ
时间: 2007-12-18 10:17
比如我的方法(程序有些复杂)得到的结果格式为:
以下是原始程序时间和已被(病毒或人为)修改的时间对比(单行为新增不确定有问题):(请另保存)
2004-08-30 16:13 C:\ProgramFiles\CommonFiles\ACDSystems\EN \294,912 Sync.exe
5004-08-30 16:13 C:\ProgramFiles\CommonFiles\ACDSystems\EN \294,912 Sync.exe
2004-10-06 14:01 C:\ProgramFiles\ACDSystems\ACDSee\7.0\9,560,064 ACDSee7.exe
2006-11-01 21:11 C:\ProgramFiles\CommonFiles\Real\Update_OB\184,366 r1puninst.exe
2006-11-06 21:11 C:\ProgramFiles\CommonFiles\Real\Update_OB\184,366 r1puninst.exe
作者: everest79
时间: 2007-12-18 10:49
zjhj
我实验的是findstr命令可以支持3MB以下50000行的查找源来搜索同样大小文件,并不存在你说的文件过大问题
而C.txt没有内容,我怀疑是两个文件相同,你又在findstr命令中启用了/v参数
至于你的应用,按你所讲的,用fc的话不但不能得到精确的值,而且会让代码复杂化
作者: ZJHJ
时间: 2007-12-18 12:19
这就奇怪了,上面的方法,我都一一实验过,什么参数也没有加.
得到的结果都是:搜索的字符窜太长!
其实我也想用最简单的命令,时间最快的.
作者: everest79
时间: 2007-12-18 12:32
可能是你生成的文件列表含有特殊字符或某一行的长度超出了限制
作者: terse
时间: 2007-12-18 13:25
: 列出B文件有A文件没有的行
findstr /vg:a.txt b.txt>ccc.txt
测试A文件602KB 11000行 B文件435KB 5000行
测试通过!并不是你说的 “我看你们也没有试过!”