Windows 获取带有首次出现标记的常用字符串列表

Windows 获取带有首次出现标记的常用字符串列表,windows,string,batch-file,Windows,String,Batch File,我有一大堆有内容的文本文件。首先,我想在全球范围内对这些行进行编号。然后我提取了所有在某处重复的行(在任何给定文件中至少出现两次)。但现在我需要用第一行出现的文件名和行号来标记所有这些行。现在有趣的是,它需要是一个windows批处理文件,使用本机windows工具。这就是为什么我一开始就有这个问题 总而言之: 我有一个具有唯一字符串/行的文件a,在给定的文件集中,每个字符串/行至少出现两次 我需要搜索这些文件,并用 -第一次出现行的文件名 -此文件中的行号 这是我的代码,用于对行进行编号并格式

我有一大堆有内容的文本文件。首先,我想在全球范围内对这些行进行编号。然后我提取了所有在某处重复的行(在任何给定文件中至少出现两次)。但现在我需要用第一行出现的文件名和行号来标记所有这些行。现在有趣的是,它需要是一个windows批处理文件,使用本机windows工具。这就是为什么我一开始就有这个问题

总而言之:

我有一个具有唯一字符串/行的文件a,在给定的文件集中,每个字符串/行至少出现两次

我需要搜索这些文件,并用 -第一次出现行的文件名 -此文件中的行号

这是我的代码,用于对行进行编号并格式化文件

@echo off
setlocal EnableDelayedExpansion
set /a lnum=0
if not [%1]==[] pushd %1

for /r %%F in (*.txt) do call :sub "%%F"
echo Total lines in %Files% files: %Total%
popd
exit /b 0
:Sub
set /a Cnt=0

for /f %%n in ('type %1') do (
  set /a Cnt+=1
  set /a lnum=!lnum!+1
  echo ^<!lnum!^> %%n >> %1_ln.txt && echo ^<!lnum!^> >> %1_ln.txt && echo. >> %1_ln.txt
)
set /a Total+=Cnt
set /a Files+=1
echo %1: %Cnt% lines
@echo关闭
setlocal EnableDelayedExpansion
设置/a lnum=0
如果不是[%1]=[]推送%1
对于(*.txt)中的/r%%F,请调用:子“%%F”
回显%Files%文件中的行总数:%Total%
邻苯二胺
退出/b0
:Sub
设置/a Cnt=0
对于(‘类型%1’)中的/f%%n,请执行以下操作(
设置/a Cnt+=1
设置/a lnum=!lnum!+1
echo^%%n>>%1_ln.txt&&echo^>%1_ln.txt&&echo.>%1_ln.txt
)
集合/a总计+=Cnt
设置/a文件+=1
回显%1:%Cnt%行
@ECHO OFF
SETLOCAL
对于/f“delims=”%(A)DO中的%%s(
集合搜索=Y
对于/f“delims=”%%f IN(
'dir/s/b/a-d*.txt')如果已定义,则执行搜索(
对于/f“tokens=1delims=:”%%L IN(
'findstr/b/e/n/l/c:“%%s”^
@echo off
setlocal EnableDelayedExpansion
设置lnum=0
如果不是“%~1”==”推送%1
rem“我有一堆文本文件…”(%F是文件名)
对于(*.txt)中的/r%%F,请调用:子“%%F”
回显%Files%文件中的行总数:%lnum%
邻苯二胺
退出/b0
:子“文件名”
设置Cnt=0
rem“…带有某些内容”(%n为行内容)
(对于/f“usebackq delims=“%%n in(%1)do(
设置/a Cnt+=1
rem“首先,我想对这些行进行全局编号。”
设置/a lnum+=1
回声^%%n
rem“然后我提取了在某个地方重复的所有行”(之前定义的行)
如果定义了行[%%n](
rem“我需要用文件名和此行第一次出现的行号标记所有这些行。”
回音^
回音/
)否则(
REM(使用*本地*行号和文件名存储此行的第一次出现)
设置行[%%n]=!Cnt!:%1
)
))>“%~PN1_ln.txt”
设置/A文件+=1
回显%1:%Cnt%行
退出/B
上述批处理程序会忽略输入文件中的空行,如果它们包含特殊的批处理字符(如
!&<>|
),则会失败;如果需要,此限制可能会被修复。

@ECHO OFF&setlocal
@ECHO OFF & setlocal
for /f "tokens=1*delims==" %%i in ('set "$" 2^>nul') do set "%%i="

for %%a in (*.txt) do (
 for /f %%b in ('find /v /c "" ^<"%%a"') do echo(%%b lines in %%a.
 set /a counter=0, files+=1
 for /f "usebackqdelims=" %%b in ("%%~a") do (
    set /a counter+=1, total+=1
    set "line=%%b"
    setlocal enabledelayedexpansion
    if not defined $!line! set "$!line!=%%a=!counter!=!line!"
    for /f "delims=" %%i in ('set "$" 2^>nul') do (if "!"=="" endlocal)& set "%%i"
    )
)
echo(%total% lines in %files% files.
for /f "delims=" %%a in (a) do set "#%%a=%%a"
for /f "tokens=2,3*delims==:" %%i in ('set "$" 2^>nul') do (
    if defined #%%k echo("%%k" found in %%i at line %%j.
)
对于/f“tokens=1*delims=”%%i in('set“$”2^>nul')do set“%%i=” 对于(*.txt)中的%%a,请执行以下操作( 对于('find/v/c“^nul')中的/f%%b,执行(如果“!”==“endlocal”)并设置“%%i” ) ) 回显(%total%)行,在%files%文件中。 对于/f“delims=”(a)do set中的%%a“#%%a=%%a” 对于/f“tokens=2,3*delims==:”%%i in('set“$”2^>nul')do( 如果定义了#%%k回显(%%k)在%%i的第%%j行中找到。 )

脚本可以处理
!&|%
,但不能处理
=

,那么问题是什么?代码中什么不起作用?什么是“第一个”文件?按名称、时间排序…?包括子文件夹?请告诉我更多。谢谢,这正是我需要的。我修改了它以完全满足我的需要,但基本思想才是关键。如果我没有弄错的话,findstr不能接受太长的行来处理。我已经使用了另一种解决方案,但也谢谢你,我也将从中学习。
@echo off
setlocal EnableDelayedExpansion
set lnum=0
if not "%~1" == "" pushd %1

rem "I've got bunch of text files..." (%%F is file name)
for /r %%F in (*.txt) do call :sub "%%F"
echo Total lines in %Files% files: %lnum%
popd
exit /b 0


:Sub "filename"
set Cnt=0

rem "... with some content." (%%n is line contents)
(for /f "usebackq delims=" %%n in (%1) do (
   set /a Cnt+=1
   rem "First I wanted to number the lines globally."
   set /a lnum+=1
   echo ^<!lnum!^> %%n 
   rem "Then I extracted all lines that are duplicated somewhere" (that were defined before)
   if defined line[%%n] (
      rem "I need to mark all of these lines with the filename and line number of the first occurrence of this line."
      echo ^<!line[%%n]!^>
      echo/
   ) else (
      REM (Store the first occurrence of this line with *local* line number and filename)
      set line[%%n]=!Cnt!: %1
   )
)) > "%~PN1_ln.txt"
set /A Files+=1
echo %1: %Cnt% lines
exit /B
@ECHO OFF & setlocal
for /f "tokens=1*delims==" %%i in ('set "$" 2^>nul') do set "%%i="

for %%a in (*.txt) do (
 for /f %%b in ('find /v /c "" ^<"%%a"') do echo(%%b lines in %%a.
 set /a counter=0, files+=1
 for /f "usebackqdelims=" %%b in ("%%~a") do (
    set /a counter+=1, total+=1
    set "line=%%b"
    setlocal enabledelayedexpansion
    if not defined $!line! set "$!line!=%%a=!counter!=!line!"
    for /f "delims=" %%i in ('set "$" 2^>nul') do (if "!"=="" endlocal)& set "%%i"
    )
)
echo(%total% lines in %files% files.
for /f "delims=" %%a in (a) do set "#%%a=%%a"
for /f "tokens=2,3*delims==:" %%i in ('set "$" 2^>nul') do (
    if defined #%%k echo("%%k" found in %%i at line %%j.
)