比较TEXT文件并获取缺少的单词

时间:2014-06-07 11:25:02

标签: batch-file cmd compare dos findstr

我有2个txt文件,第一个是json文件的结果,第二个必须包含JSON的内容+其他TXT文件的内容。

database1.txt

word1
word2
word3
word8

Database2.txt(来自JSON)

word1
word5
word7
word8

Database3.txt(Database1 + Database2)

Word1
Word2
Word3
Word5
Word7
Word8

这是我的代码:

@ECHO OFF
setlocal enabledelayedexpansion
IF EXIST "%LOCALAPPDATA%\xxx\xxx\database.json". (

for /f "delims=" %%a in ('type "%LOCALAPPDATA%\xxx\xxx\database.json"') do for %%b in (%%a) do (
ECHO %%b >>json.tmp
)

for /f "tokens=* skip=1 delims= " %%a in (json.tmp) do (
call :sub1 %%a

>> Json_cl.txt echo.!S!
)

set row=
for /F "delims=" %%j in (Json_cl.txt) do (
  if  defined row echo.!row!>>Password_JD.txt
  set row=%%j
)


findstr /V /g:"Password_list.txt" "Password_JD.txt">1.out
        type Password_list.txt 1.out>Updated_PW.txt

del Json_cl.txt
del json.tmp
del Password_JD.txt
del 1.out
goto :eof

:sub1
set S=%*
set S=!S:"=!

goto :eof
)

代码效果很好但有时看起来好像FINDSTR dosnt找不到字。

有人可以帮我修理它还是可以告诉我更好的比较方法?

谢谢

2 个答案:

答案 0 :(得分:0)

此脚本使用aacini称为Uniq.bat的强大工具

@echo off
copy database1.txt + database2.txt tmp.txt >nul
type tmp.txt | sort |uniq >database3.txt
del tmp.txt

<强> UNIQ.BAT

@if (@CodeSection == @Batch) @then

@CScript //nologo //E:JScript "%~F0" & goto :EOF & Rem aacini 2013

@end

var line, prevLine = "";
while ( ! WScript.Stdin.AtEndOfStream ) {
   line = WScript.Stdin.ReadLine();
   if ( line != prevLine ) {
      WScript.Stdout.WriteLine(line);
      prevLine = line;
   }
}

答案 1 :(得分:0)

问题1:最终输出中重复单词的可能性

FINDSTR有一个讨厌的错误 - 如果匹配不同长度的多个文字搜索字符串,那么它可能会错过一些匹配。您没有显式指定正则表达式或文字搜索,因此如果/ G文件中的第一行包含正则表达式元字符,FINDSTR将执行正则表达式搜索,否则它将执行文字搜索。有关错误以及文字与正则表达式问题的详细信息,请参阅What are the undocumented features and limitations of the Windows FINDSTR command?

如果要对多个搜索字符串使用FINDSTR,则应使用/L选项明确强制进行文字搜索,并使用/I选项强制进行不区分大小写的搜索。当然,如果您的密码区分大小写,则无法接受。

如果密码区分大小写,那么您可以使用/R选项进行正则表达式搜索,但是您必须确保没有任何搜索字符串包含正则表达式元字符,否则所有元字符必须使用前导反斜杠\进行转义。

必须转义的正则表达式元字符是:. * ^ $ [ \。 但是批量搜索和替换*非常困难。但是,这不应该是一个问题,否则您的JSON解析器将失败,因为简单的FOR循环会破坏包含*?的单词。

问题2:最终输出中缺少的字

默认情况下,FINDSTR将在目标行内的任何位置查找搜索字符串。所以像WIN这样的词会匹配TWINS。因此,如果您的JSON文件包含TWINS,密码文件中的新单词WIN将无法显示在输出中。

解决方案是与FINDSTR /X选项完全匹配。但是你有一个潜在的空间问题,因为你的JSON解析器在每个单词的末尾附加一个空格。可以通过将ECHO %%b >>json.tmp更改为ECHO %%b>>json.tmp

来解决此问题