Board logo

标题: [文本处理] 求助坛友bat 对比2文本内容,给出相同与不同 [打印本页]

作者: 881966    时间: 2023-2-19 19:37     标题: 求助坛友bat 对比2文本内容,给出相同与不同

求助坛友     bat 对比包含特殊字符与超大的2文本内容,给出相同与不同

网上的基本上都参考了,始终无果,特此求助坛友,尽量不用第三方

type "a.txt" | findstr /belig:"b.txt">>相同内容.txt
type "a" | findstr /bevlig:"b.txt">不同内容.txt
type "a.txt" | findstr /bevlig:"b.txt">>不同内容.txt

以上代码可以处理无特殊字符的小文件

链接:https://pan.baidu.com/s/1sW7vsjDGth92b9r-dfAVOQ
提取码:1234

恳请坛友斧正:handshake
作者: WHY    时间: 2023-2-20 13:24

type "a" | findstr /bevlig:"b.txt">不同内容.txt 这一句是错误的。
看了下附件,两个文本大小都不超过3MB,13W多行,谈不上"超大"。
用 PowerShell 就可以搞定,脚本长一点而已。

保存为 Test.ps1,单击右键,选择"使用 PowerShell 运行"。
  1. $myPath = $MyInvocation.MyCommand.Path -replace '\\[^\\]*$', '\';
  2. $fileA = $myPath + 'a.txt';            #源文本A
  3. $fileB = $myPath + 'b.txt';            #源文本B
  4. $fSame = $myPath + '相同.txt';         #相同文本
  5. $fDiff = $myPath + '不同.txt';         #不同文本
  6. If (![IO.File]::Exists($fileA) -or ![IO.File]::Exists($fileB)){
  7.     echo '源文件不存在';
  8.     [Console]::ReadLine();
  9.     exit;
  10. }
  11. $htA = New-Object System.Collections.HashTable;                               #HashTable,存放文本A数据
  12. $htB = New-Object System.Collections.HashTable;                               #HashTable,存放文本B数据
  13. $srA = New-Object System.IO.StreamReader($fileA, [Text.Encoding]::Default);   #读文本A
  14. $srB = New-Object System.IO.StreamReader($fileB, [Text.Encoding]::Default);   #读文本B
  15. $swSame = New-Object System.IO.StreamWriter($fSame, $false, [Text.Encoding]::Default); #写文件->相同
  16. $swDiff = New-Object System.IO.StreamWriter($fDiff, $false, [Text.Encoding]::Default); #写文件->不同
  17. while($srB.Peek() -ge 0){
  18.     $strLine = $srB.ReadLine();           #逐行读文本B
  19.     If (!$htB.ContainsKey($strLine)){
  20.         $htB.Add($strLine, $true);        #存入HashTable
  21.     }
  22. }
  23. $srB.Dispose();
  24. $srB.Close();
  25. while($srA.Peek() -ge 0){
  26.     $strLine = $srA.ReadLine();           #逐行读文本A
  27.     If (!$htA.ContainsKey($strLine)){
  28.         $htA.Add($strLine, $true);        #存入HashTable
  29.     }
  30.     If (!$htB.ContainsKey($strLine)){
  31.         $swDiff.WriteLine($strLine);      #写文件->不同
  32.         $swDiff.Flush();
  33.     } Else {
  34.         $swSame.WriteLine($strLine);      #写文件->相同
  35.         $swSame.Flush();
  36.     }
  37. }
  38. $srA.Dispose();
  39. $srA.Close();
  40. $swSame.Dispose();
  41. $srB = New-Object System.IO.StreamReader($fileB, [Text.Encoding]::Default);   #读文本B
  42. while($srB.Peek() -ge 0){
  43.     $strLine = $srB.ReadLine();
  44.     If (!$htA.ContainsKey($strLine)){
  45.         $swDiff.WriteLine($strLine);      #写文件->不同
  46.         $swDiff.Flush();
  47.     }
  48. }
  49. $srB.Dispose();
  50. $srB.Close();
  51. $swDiff.Dispose();
  52. echo 'Done';
  53. [Console]::ReadLine();
复制代码

作者: 881966    时间: 2023-2-20 17:20

回复 2# WHY

感谢帮助 ,我的电脑不能运行PowerShell ,附件的两个文本大小只是象征性的,
作者: Batcher    时间: 2023-2-20 21:46

回复 1# 881966


第三方命令行工具 grep 处理大文件的效率还不错
http://bcn.bathome.net/s/tool/index.html?key=grep
  1. grep -xFf 1.txt 2.txt > Same.txt
  2. grep -vxFf 1.txt 2.txt > Diff.txt
复制代码

作者: hfxiang    时间: 2023-2-21 11:40

本帖最后由 hfxiang 于 2023-2-21 11:44 编辑

回复 4# Batcher

这个方法很简单,但有不明白之处,求解。具体如下:
测试文件1.txt及2.txt均已保存为ANSI编码,
1.txt
  1. 203.208.39.194
  2. 203.208.40.66
  3. 220.181.174.226 translate.googleapis.com
  4. #
复制代码
2.txt(含空行,在第3行)
  1. 203.208.39.194
  2. 203.208.40.66
  3. translate.google.cn
  4. #
复制代码
测试如下:
  1. grep -xFf 1.txt 2.txt > Same1.txt
  2. grep -xFf 2.txt 2.txt > Same2.txt
  3. grep -vxFf 1.txt 2.txt > Diff1.txt
  4. grep -vxFf 2.txt 2.txt >  Diff2.txt
复制代码
结果如下:
Same1.txt(正确
  1. 203.208.39.194
  2. 203.208.40.66
  3. #
复制代码
Same2.txt(错误
  1. 203.208.39.194
  2. 203.208.40.66
  3. translate.google.cn
  4. #
复制代码
Diff1.txt(错误
  1. translate.google.cn
复制代码
俺的理解Diff1.txt应为
  1. 220.181.174.226 translate.googleapis.com
  2. translate.google.cn
复制代码
Diff2.txt(为空)(错误
俺的理解应为
  1. translate.google.cn
  2. 220.181.174.226 translate.googleapis.com
复制代码

作者: hfxiang    时间: 2023-2-21 12:06

回复 1# 881966

如接受第3方工具gawk( http://bcn.bathome.net/tool/4.1.3/gawk.exe ),如下指令经测试正常(结果文档中已去除重复行,但其次序可能不一定是原文件次序)
  1. awk "NR==FNR{a[$0]++;next}a[$0]{a[$0]=0;print}" 1.txt 2.txt>Same.txt
  2. awk "NR==FNR{a[$0]=1;next}!a[$0]++{print $0;a[$0]++}END{for(i in a)if(a[i]==1)print i}" 1.txt 2.txt>Diff.txt
复制代码

作者: 881966    时间: 2023-2-21 14:15

回复 6# hfxiang


    尽量不使用第三方
作者: Batcher    时间: 2023-2-21 14:24

回复 5# hfxiang


不知道楼主的需求和你的理解是否一致。
不过从这个测试结果来看,grep或findstr正常得到的结果就是这样的(不同于Linux的diff命令那样的比较结果)。
作者: 881966    时间: 2023-2-21 18:37

回复 6# hfxiang


    尽量不用第三方处理
作者: wanghan519    时间: 2023-9-20 15:35

本帖最后由 wanghan519 于 2023-9-20 15:59 编辑

回复 5# hfxiang


    我这里grep的结果没错,两个求相同的命令结果一样,求不同的两句分别是1里找不到2和2里找不到1,拼起来就是你要的结果
5楼的测试出错,因为第2第4句测试本身写错了。。。

作者: Nsqs    时间: 2023-10-7 06:35

不理解为什么要写那么复杂啊? 还是说我审题不清?
  1. $C=(compare (gc A.txt) (gc B.txt) -IncludeEqual).Where({$_.SideIndicator -eq '=='},'split')
  2. $arr='相同','不同'
  3. 0..1|%{$C[$_].InputObject >"$($arr[$_]).txt"}
复制代码

作者: Batcher    时间: 2023-10-7 08:45

回复 3# 881966


    真实需要处理的文件大小是怎样的?




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