批量查找目录中其他.txt文件中的字符串(包含在textlist.txt中),并将值从.txt复制到新文件

时间:2012-01-23 19:36:26

标签: windows-7 batch-file copy find

在查找批处理以查找和复制textlist.txt中列出的文本文件中的字符串时遇到问题。是否有可能使批处理应该在目录中的文本文件中找到所有值(来自textlist)并将所有这些值复制到新文件中。 我有以下目录:

textlist.txt包含:

  • 3010
  • 3020
  • 3030 ....

和其他带有txt文件的目录:

3010.txt包含分隔符,例如:

  • 3010 a1
  • 3011 b1
  • 3012 c1 ....

3020.txt包含例如:

  • 3020 a4
  • 3021 b3
  • 3022 g5 ....

3030.txt包含例如:

  • 3030 h5 g7
  • 3031 f2
  • 3032 t4 ....

和其他3040.txt,3050.txt等。

我需要像这样的结果txt文件。

  • 3010 a1 {此字符串来自3010.txt,但可能在其他txt文件中找到。}
  • 3020 a4 {此字符串来自3010.txt,但可能在其他txt文件中找到。}
  • 3030 h5 g7 {此字符串来自3010.txt,但可能在其他txt文件中找到。}

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

以下内容将生成一个文件,其中包含所有输入行的所有文件的匹配项:

@ECHO OFF
>results.txt (
  FOR /F "delims=" %%i IN (textlist.txt) DO (
    FIND "%%i" files\*.txt | FINDSTR /v "^---- ^$"
  )
)

它的工作原理如下:

  • FIND接受一个输入行,在指定的文件中搜索它并打印结果,这些结果通过管道传输到FINDSTR

  • FINDSTR删除FIND产生的'噪音'(空行和------ filename.txt之类的行)并打印其余内容。

  • 解析后的结果将打印在标准输出上,并在整个循环中重定向到results.txt

如果根据您的评论,您还需要创建另一个包含没有匹配项的行的文件,您可以像这样修改上述脚本:

@ECHO OFF
>results.txt 2>notinfile.txt (
  FOR /F "delims=" %%i IN (textlist.txt) DO (
    (FIND "%%i" files\*.txt || (ECHO %%i) 1>&2) | FINDSTR /v "^---- ^$"
  )
)

除非FIND没有输入行匹配,否则逻辑基本相同。在这种情况下,搜索词会打印在标准错误ECHO … 1>&2)上。 FIND的标准输出仍会传递给FINDSTR,因为在这种情况下它只包含 噪音,FINDSTR不会产生任何效果。

因此,循环在标准输出和标准错误上产生结果,每次都取决于FIND的结果。与以前的版本一样,标准输出被重定向到results.txt,标准错误被重定向到notinfile.txt

<强>更新

第二个脚本有一个很小的缺陷,在您的情况下可能会或可能不会很严重,具体取决于您将如何使用notinfile.txt文件。该缺陷包括在notinfile.txt的每个值的末尾添加一个额外的空格。

无论是某种bug还是某种人工制品,我都不知道,但我发现如果我将FIND的结果存储到一个临时文件中,然后将它们加载到{{ 1}},不会产生额外的空间。我找不到任何其他方法来修复额外的空间问题,所以这是修改后的版本:

FINDSTR

更新2 (以下是其他评论)

由于文件中的值是制表符分隔的,因此您可以在搜索字符之后的搜索字符串中包含分隔符,以防止@ECHO OFF >results.txt 2>notinfile.txt ( FOR /F "delims=" %%i IN (textlist.txt) DO ( FIND "%%i" files\*.txt >tmpResults || (ECHO %%i) 1>&2 FINDSTR /v "^---- ^$" <tmpResults ) ) DEL tmpResults 2>NUL 与例如aaa匹配。 aaa/bbb。而不是

FIND "%%i"

你会有

FIND "%%i   "

%%i之后的宽空格是制表符。

我还想建议FINDSTR命令的替代版本。当您只搜索一个术语时,您可以更改此信息:

FINDSTR /v "^---- ^$"

只是这个:

FINDSTR "%%i"

答案 1 :(得分:0)

使用FOR命令为文件中的每一行执行命令(使用/ F开关)。使用FIND搜索文件。这是一个演示其用途的示例。

FIND报告匹配,但也添加一行以&#34; ----&#34;显示找到匹配项的文件。这就是第一个FOR转储到临时文件的原因。第二个用于评论任何以&#34; - &#34;开头的行。从而过滤掉FIND中的信息。如果您多次运行批处理,它将删除任何以前的results.txt文件。

重要的是textlist.txt文件与搜索文件夹不在同一文件夹中,否则其内容将包含在结果中。

@echo off
setlocal
set searchFolder=C:\theFolder

del tempResults.txt >nul 2>nul
del results.txt >nul 2>nul

for /F "delims=" %%i in (textlist.txt) do find "%%i" %searchFolder%\*.txt >> tempResults.txt
for /F "delims=" "eol=-" %%i in (tempResults.txt) do echo %%i >>results.txt
del tempResults.txt >nul 2>nul

endlocal
相关问题