找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 25699|回复: 11

[文本处理] 求助坛友bat 对比2文本内容,给出相同与不同

[复制链接]
发表于 2023-2-19 19:37:04 | 显示全部楼层 |阅读模式
求助坛友     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
发表于 2023-2-20 13:24:54 | 显示全部楼层
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();
复制代码

评分

参与人数 1技术 +1 收起 理由
881966 + 1 乐于助人

查看全部评分

 楼主| 发表于 2023-2-20 17:20:30 | 显示全部楼层
回复 2# WHY

感谢帮助 ,我的电脑不能运行PowerShell ,附件的两个文本大小只是象征性的,
发表于 2023-2-20 21:46:04 | 显示全部楼层
回复 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
复制代码

评分

参与人数 1技术 +1 收起 理由
881966 + 1 乐于助人

查看全部评分

发表于 2023-2-21 11:40:41 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2023-2-21 12:06:09 | 显示全部楼层
回复 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
复制代码

评分

参与人数 1技术 +2 收起 理由
881966 + 2 乐于助人

查看全部评分

 楼主| 发表于 2023-2-21 14:15:32 | 显示全部楼层
回复 6# hfxiang


    尽量不使用第三方
发表于 2023-2-21 14:24:21 | 显示全部楼层
回复 5# hfxiang


不知道楼主的需求和你的理解是否一致。
不过从这个测试结果来看,grep或findstr正常得到的结果就是这样的(不同于Linux的diff命令那样的比较结果)。
 楼主| 发表于 2023-2-21 18:37:10 | 显示全部楼层
回复 6# hfxiang


    尽量不用第三方处理
发表于 2023-9-20 15:35:53 | 显示全部楼层
本帖最后由 wanghan519 于 2023-9-20 15:59 编辑

回复 5# hfxiang


    我这里grep的结果没错,两个求相同的命令结果一样,求不同的两句分别是1里找不到2和2里找不到1,拼起来就是你要的结果
5楼的测试出错,因为第2第4句测试本身写错了。。。
发表于 2023-10-7 06:35:38 | 显示全部楼层
不理解为什么要写那么复杂啊? 还是说我审题不清?
  1. $C=(compare (gc A.txt) (gc B.txt) -IncludeEqual).Where({$_.SideIndicator -eq '=='},'split')
  2. $arr='相同','不同'
  3. 0..1|%{$C[$_].InputObject >"$($arr[$_]).txt"}
复制代码
发表于 2023-10-7 08:45:51 | 显示全部楼层
回复 3# 881966


    真实需要处理的文件大小是怎样的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 11:56 , Processed in 0.012636 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表