Windows批处理脚本来比较两个文本文件

HTWingNut

我有这个脚本:

for /f "delims=" %%a in (data_A.txt) DO (
    set "flag="
    for /f "delims=" %%b in (data_B.txt) do (
        if "%%a"=="%%b" CALL :flagit
    )
    if not defined flag >>notmatch.txt echo %%a
)

:flagit
set flag=1
goto :eof

我正在比较两个文本文件之间的每一行,以确定不匹配的条目。这些文件包含校验和哈希值和相对路径信息。

它可以工作,但是速度很慢。一个具有100,000个条目的文件要花费两个半小时,而且我必须做两次,因为我必须比较两种方式来捕获A上可能不在B上但可能不在A上的任何条目。数据也不一定按任何特定的排序顺序。

我正在寻找:

  • A组上的文件不在B组上的文件
  • B组上的文件不在A组上
  • 校验和不匹配的文件

我很习惯处理前两个文件(文件不在A / B上),因为一旦获得“不匹配”的条目,它们应该很少,并且比较两者上是否存在相对路径(我希望)。但是最后一个是实时的。

数据示例:

dd2da0dcb5a54989dd4d2312013ddb12345c0593ed59a6d307461d925d57226d89d24c2e5a95c0d4082b14118cb8766d89ae69e40c4dac1ab5bd718bd7c58d9a \Personal\Pictures\Camera 2019\2019-02-17 15.02.34.jpg 
509ebfd1e2c180ccd6bd679204b7c255f3c7abcdefg7660e219fa9eb58658d96a3ef8cec179221acb78be81f8dd78bd3a8b1a3cdaef0cd691725d3402a495b0b \Personal\Pictures\Camera 2019\2019-02-17 15.03.59.jpg 
a3180dce7675aeb161f8fe25fcbd39ff2678faf2326d3e2a39fchfasff90a714134bdd22f91103026c494e6ffcfd62d5cb3d46992de9dfff71b49f9a734c0ab9 \Personal\Pictures\Camera 2019\2019-02-17 17.11.41.jpg 
b5262c6ce5c4425a4ed737a7a8fdbc040c68003785d67177a25c86d9fb531ce42f74648783aed4bbb3aff7304b00d44b14eaa2a6c728b8802cafd22059570212 \Personal\Pictures\Camera 2019\2019-02-18 18.06.14.jpg 
da7e1eb7ec147628a59e702c55159bc32d66f3c540dfb4be436f136137af913a7139640701eba84f34796da4f35c9fasdffae35542f56b1dccf009d1cec30d20 \Personal\Pictures\Camera 2019\2019-02-22 06.18.15.jpg 
72c99a6f4394b4f65d4b66b00071de1d40cb717f525863875c36b2bc79dd0a8491ee8854b8b4437bfcfe4aa8379861aa43a7850dfac144d5db5b2c6b75dcf292 \Personal\Pictures\Camera 2019\2019-02-22 06.18.23.jpg 
4a8a39e68379b2c671d83935b13dc82dd60d5e8b36a32a8677698a9306876zcvaffaaa4af292d53a8f52df4ee1c7bc701068064f4d28009566e8825abf2ab077 \Personal\Pictures\Camera 2019\2019-02-22 06.20.10.jpg 
074103664be0c91664bd4e2e51d0e051c9cf8f27c26511d3a691d0asdfadfa134234808a16bf0679a8500910b09cf24d9e9c88788b4a749a81ec2d15f78cacfd \Personal\Pictures\Camera 2019\2019-02-22 06.27.14.jpg 
28dc03a7722b0781caa4dfasdf664w666777068c79456941a159ffefa1d9c34fed83b98858394c1aa471396a0b1a448d8dd89e361c564e6b27e451b2dd701dd7 \Personal\Pictures\Camera 2019\2019-02-23 11.54.34.jpg 

for循环的工作方式是扫描另一个文件,直到找到不匹配的文件,然后将其输出到日志文件,然后转到下一个文件。似乎应该有一种方法,一旦文件已匹配或不匹配,便从搜索中将其删除。

编辑-好的,我有点弄错了PowerShell。比较对象工作良好,但只需要弄清楚如何仅显示AB上都存在的不同文件,并记录以将仅在A上和仅在B上的文件分开即可...

不是我
  • 在PowerShell /更新中:

要在PowerShell中执行相同的操作,可以使用答案中提到@JoseZ方法,并且只需进行最少的编辑,即可获得保存在NoMatch.txt文件中的每个文件中不同的字符串:

  • 为了获得两者不同的内容,即获得不在data_B.txt中的data_A.txt和不在data_A.txt中的data_B.txt的行/内容
Set-Location -Path "D:\Your\Folder"; Clear-Content -path ".\NoMatch.txt"; $filebefore=".\data_A.txt"; $file_after=".\data_B.txt"

### Compare-Object way
$array = Compare-Object $(Get-Content $filebefore) $(Get-Content $file_after)
$array | where {$_.SideIndicator -eq "<="} | Format-Table -Property InputObject -AutoSize -HideTableHeaders

### -NotIn operator way
$(Get-Content $filebefore) | Where-Object {$_ -notIn $(Get-Content $file_after)} | Out-File ".\NoMatch.txt" -Append
$(Get-Content $file_after) | Where-Object {$_ -notIn $(Get-Content $filebefore)} | Out-File ".\NoMatch.txt" -Append
  • 输出是保存在NoMatch.txt中的每个文件的最后一行
>Get-Content ".\NoMatch.txt"

18dc03a7722b0781caa4dfasdf664w666777068c79456941a159ffefa1d9c34fed83b98858394c1aa471396a0b1a448d8dd89e361c564e6b27e451b2dd701
28dc03a7722b0781caa4dfasdf664w666777068c79456941a159ffefa1d9c34fed83b98858394c1aa471396a0b1a448d8dd89e361c564e6b27e451b2dd701


  • 仅从data_B.txt中获得不在data_A.txt中的行/内容
Set-Location -Path "D:\Your\Folder"; Clear-Content -path ".\NoMatch.txt"; $filebefore=".\data_A.txt"; $file_after=".\data_B.txt"

### Compare-Object way
$array = Compare-Object $(Get-Content $filebefore) $(Get-Content $file_after)
$array | where {$_.SideIndicator -eq "<="} | Format-Table -Property InputObject -AutoSize -HideTableHeaders

### -NotIn operator way
$(Get-Content $filebefore) | Where-Object {$_ -notIn $(Get-Content $file_after)} | Out-File ".\NoMatch.txt" -Append
  • 输出是保存在文件NoMatch.txt中的data_B.txt文件的最后一行

>Get-Content ".\NoMatch.txt"

18dc03a7722b0781caa4dfasdf664w666777068c79456941a159ffefa1d9c34fed83b98858394c1aa471396a0b1a448d8dd89e361c564e6b27e451b2dd701


  • 在bat / cmd文件中:

对于较短的字符串,您可以尝试使用 Findstr /vixg:data_A.txt data_B.txt

  /I         Specifies that the search is not to be case-sensitive.
  /X         Prints lines that match exactly.

  /V         Prints only lines that do not contain a match.

  /G:file    Gets search strings from the specified file(/ stands for console).

观察:为了Findstr使此比较/查找相同/不同的字符串,总长度限制为最大250个字符

(String_A).Length + (String_B).Length <= 250 characters

-这就是为什么我在以下示例中将您的字符串减少到最多125个字符的原因:

仅在文件data_A.txt中的最后一行和第一个字符上与文件data_B.txt不匹配,并且将保存在文件NoMatch.txt中


  • 仅从data_B.txt中获得不在data_A.txt中的行/内容
@echo off 

cd /d "%~dp0" && if not exist data_B.txt call :^) 

cd. >nul >.\NoMatch.txt && for /f tokens^=* %%i in (
'findstr /vixg:data_A.txt data_B.txt')do >>.\NoMatch.txt echo=%%~i

goto :EOF

:^)
>data_A.txt ^
    (
     echo=dd2da0dcb5a54989dd4d2312013ddb12345c0593ed59a6d307461d925d57226d89d24c2e5a95c0d4082b14118cb8766d89ae69e40c4dac1ab5bd718bd7c58
     echo=509ebfd1e2c180ccd6bd679204b7c255f3c7abcdefg7660e219fa9eb58658d96a3ef8cec179221acb78be81f8dd78bd3a8b1a3cdaef0cd691725d3402a495
     echo=a3180dce7675aeb161f8fe25fcbd39ff2678faf2326d3e2a39fchfasff90a714134bdd22f91103026c494e6ffcfd62d5cb3d46992de9dfff71b49f9a734c0
     echo=b5262c6ce5c4425a4ed737a7a8fdbc040c68003785d67177a25c86d9fb531ce42f74648783aed4bbb3aff7304b00d44b14eaa2a6c728b8802cafd22059570
     echo=da7e1eb7ec147628a59e702c55159bc32d66f3c540dfb4be436f136137af913a7139640701eba84f34796da4f35c9fasdffae35542f56b1dccf009d1cec30
     echo=72c99a6f4394b4f65d4b66b00071de1d40cb717f525863875c36b2bc79dd0a8491ee8854b8b4437bfcfe4aa8379861aa43a7850dfac144d5db5b2c6b75dcf
     echo=4a8a39e68379b2c671d83935b13dc82dd60d5e8b36a32a8677698a9306876zcvaffaaa4af292d53a8f52df4ee1c7bc701068064f4d28009566e8825abf2ab
     echo=074103664be0c91664bd4e2e51d0e051c9cf8f27c26511d3a691d0asdfadfa134234808a16bf0679a8500910b09cf24d9e9c88788b4a749a81ec2d15f78ca
     echo=28dc03a7722b0781caa4dfasdf664w666777068c79456941a159ffefa1d9c34fed83b98858394c1aa471396a0b1a448d8dd89e361c564e6b27e451b2dd701
    ) && (
>data_B.txt ^
    (
     echo=dd2da0dcb5a54989dd4d2312013ddb12345c0593ed59a6d307461d925d57226d89d24c2e5a95c0d4082b14118cb8766d89ae69e40c4dac1ab5bd718bd7c58
     echo=509ebfd1e2c180ccd6bd679204b7c255f3c7abcdefg7660e219fa9eb58658d96a3ef8cec179221acb78be81f8dd78bd3a8b1a3cdaef0cd691725d3402a495
     echo=a3180dce7675aeb161f8fe25fcbd39ff2678faf2326d3e2a39fchfasff90a714134bdd22f91103026c494e6ffcfd62d5cb3d46992de9dfff71b49f9a734c0
     echo=b5262c6ce5c4425a4ed737a7a8fdbc040c68003785d67177a25c86d9fb531ce42f74648783aed4bbb3aff7304b00d44b14eaa2a6c728b8802cafd22059570
     echo=da7e1eb7ec147628a59e702c55159bc32d66f3c540dfb4be436f136137af913a7139640701eba84f34796da4f35c9fasdffae35542f56b1dccf009d1cec30
     echo=72c99a6f4394b4f65d4b66b00071de1d40cb717f525863875c36b2bc79dd0a8491ee8854b8b4437bfcfe4aa8379861aa43a7850dfac144d5db5b2c6b75dcf
     echo=4a8a39e68379b2c671d83935b13dc82dd60d5e8b36a32a8677698a9306876zcvaffaaa4af292d53a8f52df4ee1c7bc701068064f4d28009566e8825abf2ab
     echo=074103664be0c91664bd4e2e51d0e051c9cf8f27c26511d3a691d0asdfadfa134234808a16bf0679a8500910b09cf24d9e9c88788b4a749a81ec2d15f78ca
     echo=18dc03a7722b0781caa4dfasdf664w666777068c79456941a159ffefa1d9c34fed83b98858394c1aa471396a0b1a448d8dd89e361c564e6b27e451b2dd701
    ) ) && exit /b 
  • 输出是保存在文件。\ NoMatch.txt中的data_B.txt文件中的最后一行
18dc03a7722b0781caa4dfasdf664w666777068c79456941a159ffefa1d9c34fed83b98858394c1aa471396a0b1a448d8dd89e361c564e6b27e451b2dd701


  • 为了获得两者不同的内容,即获得不在data_B.txt中的data_A.txt和不在data_A.txt中的data_B.txt的行/内容
@echo off 

cd /d "%~dp0" && if not exist data_B.txt call :^) 

cd. >nul >notmatch.txt
for /f tokens^=* %%i in ('findstr /vixg:data_A.txt data_B.txt')do >>notmatch.txt echo=%%~i
for /f tokens^=* %%i in ('findstr /vixg:data_B.txt data_A.txt')do >>notmatch.txt echo=%%~i

goto :EOF

:^)
>data_A.txt ^
    (
     echo=dd2da0dcb5a54989dd4d2312013ddb12345c0593ed59a6d307461d925d57226d89d24c2e5a95c0d4082b14118cb8766d89ae69e40c4dac1ab5bd718bd7c58
     echo=509ebfd1e2c180ccd6bd679204b7c255f3c7abcdefg7660e219fa9eb58658d96a3ef8cec179221acb78be81f8dd78bd3a8b1a3cdaef0cd691725d3402a495
     echo=a3180dce7675aeb161f8fe25fcbd39ff2678faf2326d3e2a39fchfasff90a714134bdd22f91103026c494e6ffcfd62d5cb3d46992de9dfff71b49f9a734c0
     echo=b5262c6ce5c4425a4ed737a7a8fdbc040c68003785d67177a25c86d9fb531ce42f74648783aed4bbb3aff7304b00d44b14eaa2a6c728b8802cafd22059570
     echo=da7e1eb7ec147628a59e702c55159bc32d66f3c540dfb4be436f136137af913a7139640701eba84f34796da4f35c9fasdffae35542f56b1dccf009d1cec30
     echo=72c99a6f4394b4f65d4b66b00071de1d40cb717f525863875c36b2bc79dd0a8491ee8854b8b4437bfcfe4aa8379861aa43a7850dfac144d5db5b2c6b75dcf
     echo=4a8a39e68379b2c671d83935b13dc82dd60d5e8b36a32a8677698a9306876zcvaffaaa4af292d53a8f52df4ee1c7bc701068064f4d28009566e8825abf2ab
     echo=074103664be0c91664bd4e2e51d0e051c9cf8f27c26511d3a691d0asdfadfa134234808a16bf0679a8500910b09cf24d9e9c88788b4a749a81ec2d15f78ca
     echo=28dc03a7722b0781caa4dfasdf664w666777068c79456941a159ffefa1d9c34fed83b98858394c1aa471396a0b1a448d8dd89e361c564e6b27e451b2dd701
    ) && (
>data_B.txt ^
    (
     echo=dd2da0dcb5a54989dd4d2312013ddb12345c0593ed59a6d307461d925d57226d89d24c2e5a95c0d4082b14118cb8766d89ae69e40c4dac1ab5bd718bd7c58
     echo=509ebfd1e2c180ccd6bd679204b7c255f3c7abcdefg7660e219fa9eb58658d96a3ef8cec179221acb78be81f8dd78bd3a8b1a3cdaef0cd691725d3402a495
     echo=a3180dce7675aeb161f8fe25fcbd39ff2678faf2326d3e2a39fchfasff90a714134bdd22f91103026c494e6ffcfd62d5cb3d46992de9dfff71b49f9a734c0
     echo=b5262c6ce5c4425a4ed737a7a8fdbc040c68003785d67177a25c86d9fb531ce42f74648783aed4bbb3aff7304b00d44b14eaa2a6c728b8802cafd22059570
     echo=da7e1eb7ec147628a59e702c55159bc32d66f3c540dfb4be436f136137af913a7139640701eba84f34796da4f35c9fasdffae35542f56b1dccf009d1cec30
     echo=72c99a6f4394b4f65d4b66b00071de1d40cb717f525863875c36b2bc79dd0a8491ee8854b8b4437bfcfe4aa8379861aa43a7850dfac144d5db5b2c6b75dcf
     echo=4a8a39e68379b2c671d83935b13dc82dd60d5e8b36a32a8677698a9306876zcvaffaaa4af292d53a8f52df4ee1c7bc701068064f4d28009566e8825abf2ab
     echo=074103664be0c91664bd4e2e51d0e051c9cf8f27c26511d3a691d0asdfadfa134234808a16bf0679a8500910b09cf24d9e9c88788b4a749a81ec2d15f78ca
     echo=18dc03a7722b0781caa4dfasdf664w666777068c79456941a159ffefa1d9c34fed83b98858394c1aa471396a0b1a448d8dd89e361c564e6b27e451b2dd701
    ) ) && exit /b 
  • 输出是保存在NoMatch.txt中的每个文件的最后一行
18dc03a7722b0781caa4dfasdf664w666777068c79456941a159ffefa1d9c34fed83b98858394c1aa471396a0b1a448d8dd89e361c564e6b27e451b2dd701
28dc03a7722b0781caa4dfasdf664w666777068c79456941a159ffefa1d9c34fed83b98858394c1aa471396a0b1a448d8dd89e361c564e6b27e451b2dd701

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在两个文本文件批处理脚本中查找差异列表

来自分类Dev

打击两个文本文件比较脚本

来自分类Dev

使用批处理或perl脚本将两个文本文件合并为一个

来自分类Dev

使用批处理或perl脚本将两个文本文件合并为一个

来自分类Dev

批处理文件如何并行读取两个文本文件?

来自分类Dev

批处理文件合并两个文本文件

来自分类Dev

批处理文件如何并行读取两个文本文件?

来自分类Dev

C#-比较两个文本文件

来自分类Dev

比较两个文本文件

来自分类Dev

Python。比较两个文本文件的内容

来自分类Dev

比较Perl中的两个文本文件

来自分类Dev

Linux 比较两个文本文件

来自分类Dev

批处理文件以在两个文本文件中搜索通用字符串

来自分类Dev

批处理文件:比较 2 个文本文件并更新文本文件中的特定行

来自分类Dev

如何合并两个文本文件中的行而不在批处理命令中创建换行符

来自分类Dev

如何在文本文件中搜索两个字符串并对使用批处理脚本找到的两个字符串中的任何一个进行操作

来自分类Dev

批处理脚本以创建大文本文件

来自分类Dev

批处理脚本以获取文本文件的大小

来自分类Dev

比较两个具有重复项的文本文件并将明显的差异写入文本文件

来自分类Dev

使用 Windows 批处理脚本从文本文件中删除前几行

来自分类Dev

比较两个文件并将结果打印到新的文本文件中

来自分类Dev

使用批处理脚本比较两个文件夹中的文件

来自分类Dev

比较两个文本文件并计算出现次数

来自分类Dev

如果不匹配,如何逐行比较两个文本文件并打印错误?

来自分类Dev

用Java比较两个大文本文件

来自分类Dev

PHP按行比较两个文本文件

来自分类Dev

用Java随机比较两个文本文件

来自分类Dev

比较某些列的两个文本文件,然后返回整行?

来自分类Dev

使用Powershell比较两个文本文件并删除重复的行

Related 相关文章

  1. 1

    在两个文本文件批处理脚本中查找差异列表

  2. 2

    打击两个文本文件比较脚本

  3. 3

    使用批处理或perl脚本将两个文本文件合并为一个

  4. 4

    使用批处理或perl脚本将两个文本文件合并为一个

  5. 5

    批处理文件如何并行读取两个文本文件?

  6. 6

    批处理文件合并两个文本文件

  7. 7

    批处理文件如何并行读取两个文本文件?

  8. 8

    C#-比较两个文本文件

  9. 9

    比较两个文本文件

  10. 10

    Python。比较两个文本文件的内容

  11. 11

    比较Perl中的两个文本文件

  12. 12

    Linux 比较两个文本文件

  13. 13

    批处理文件以在两个文本文件中搜索通用字符串

  14. 14

    批处理文件:比较 2 个文本文件并更新文本文件中的特定行

  15. 15

    如何合并两个文本文件中的行而不在批处理命令中创建换行符

  16. 16

    如何在文本文件中搜索两个字符串并对使用批处理脚本找到的两个字符串中的任何一个进行操作

  17. 17

    批处理脚本以创建大文本文件

  18. 18

    批处理脚本以获取文本文件的大小

  19. 19

    比较两个具有重复项的文本文件并将明显的差异写入文本文件

  20. 20

    使用 Windows 批处理脚本从文本文件中删除前几行

  21. 21

    比较两个文件并将结果打印到新的文本文件中

  22. 22

    使用批处理脚本比较两个文件夹中的文件

  23. 23

    比较两个文本文件并计算出现次数

  24. 24

    如果不匹配,如何逐行比较两个文本文件并打印错误?

  25. 25

    用Java比较两个大文本文件

  26. 26

    PHP按行比较两个文本文件

  27. 27

    用Java随机比较两个文本文件

  28. 28

    比较某些列的两个文本文件,然后返回整行?

  29. 29

    使用Powershell比较两个文本文件并删除重复的行

热门标签

归档