如何显示找到的地方并且只显示找到的单词 Findstr?

How to show the place and only the words found Findstr?

我想知道如何显示在 findstr 中找到单词的位置?

我的代码:

Set "LFiles=%temp%\Files\*.txt">nul 2>&1

Findstr /li /G:"List.txt" "%LFiles%">"Result.TxT"

(for /F %%a in (List.txt) do (
   Findstr /li /C:"%%a" "%LFiles%" > NUL
   if not errorlevel 1 echo %%a
))>"Result2.TxT"

列表:

Disc
Music
Song
Album

结果:

DISC1312we7das67da
13dsdsa67dsahdsa7aMUSIC
dsadsdfdsaSONG1223234235

结果2:

Disc
Music
Song

Result2中想要的结果:

--------------
Filelist1.txt
--------------
Song

--------------
Filelist2.txt
--------------
Song
Disc

--------------
Filelist3.txt
--------------
Disc
Music
Song

注意:文件名是随机的

@Edit

我可以让他向您展示在每个文件中找到的内容...

来了两个问题:

  1. 如果文件名中有空格,我如何向他显示文件名?
  2. 如何将同一文件的结果合并到一行中?

.

Dir /b "%temp%\Files\*.txt">Files2.txt

Set "LFiles=LFiles=%temp%\Files\*.txt">nul 2>&1

Findstr /li /G:"List.txt" "%LFiles%">"Result.TxT"

(for /F %%a in (Files2.txt) do (
(for /F %%b in (List.txt) do (
   Findstr /li /C:"%%b" "Result.txt" > NUL
   if not errorlevel 1 echo "%%a" "%%b"
))))>>"Result2.TxT"

当前结果:

"File" "Disc"
"File" "Song"
"File" "Music"
"Files_and" "Disc"

想要的结果

File 01.txt: Song, Music
File 02.txt: Music, Disc

File 01.txt:
Song
Music

File 02.txt:
Music
Disc
@echo off
setlocal enabledelayedexpansion
set "LFiles=%temp%\Files\*.txt"
(
for %%i in ("%LFiles%") do (
  set "result="
  for /f %%j in (list.txt) do (
    findstr /li /c:"%%j" "%%~i">nul && set result=!result!, %%j
  )
  if defined result echo %%i:!result:~1!
)
)>result.txt

下面的解决方案只对 List.txt 文件中的每个单词执行一次 findstr 命令,因此它应该 运行 更快。它还将结果保存在 "file" 数组中以供进一步处理:

@echo off
setlocal EnableDelayedExpansion

Set "LFiles=%temp%\Files\*.txt"

for /F %%a in (List.txt) do (
   for /F "delims=" %%b in ('findstr /LIM /C:"%%a" "%LFiles%"') do (
      set "file[%%~Nb]=!file[%%~Nb]! %%a"
      set /A "word[%%a]+=1"
   )
)

(for /F "tokens=2* delims=[]=" %%a in ('set file[') do (
   echo --------------
   echo %%a.txt
   echo --------------
   for %%c in (%%b) do echo %%c
   echo/
)) > Result2.txt

ECHO RESULT IN REQUESTED FORMAT:
TYPE RESULT2.TXT
ECHO/
ECHO/
ECHO VALUES STORED IN "FILE" ARRAY:
SET FILE[

ECHO WORD COUNT:
SET WORD[

编辑:按照评论中的要求计算每个文件中每个单词的数量的新方法。

@echo off
setlocal EnableDelayedExpansion

Set "LFiles=%temp%\Files\*.txt"

rem Accumulate counts of all file/word combinations in a two-dimensional array
for /F %%a in (List.txt) do (
   for /F "delims=:" %%b in ('findstr /LI /C:"%%a" "%LFiles%"') do (
      set /A "count[%%~Nb][%%a]+=1"
   )
)

rem Group word counts for the same file
for /F "tokens=2,3* delims=[]=" %%a in ('set count[') do (
   set "file[%%a]=!file[%%a]!, %%b (%%c)"
)

rem Show the final result
(for /F "tokens=2* delims=[]=" %%a in ('set file[') do (
   set "line=%%b"
   echo %%a.txt = !line:~2!
)) > Result2.TxT


ECHO THE COUNT ARRAY:
SET COUNT[
ECHO/
ECHO THE FILE ARRAY:
SET FILE[

这个新方法计算每个文件中匹配的数量。如果同一个词可能在一行中出现两次或更多次,它将被计为一个。为了统计个单词,这一点可能会被修复,但是生成的代码会慢很多...