0

いくつかのコンテンツを含むテキストファイルがたくさんあります。最初に、行にグローバルに番号を付けたいと思いました。次に、どこかで重複しているすべての行を抽出しました(指定されたファイルのいずれかに少なくとも2回発生します)。しかし今、これらすべての行を、この行が最初に出現したファイル名と行番号でマークする必要があります。そして面白いのは、ネイティブの Windows ツールを使用した Windows バッチ ファイルである必要があることです。それが私がこの問題を抱えている理由です。

要約すると、次のようになります。

一意の文字列/行を持つファイルAがあり、それぞれが特定のファイル セットで少なくとも 2 回発生すると言われています。

これらのファイルを検索し、ファイルから特定の行をすべてマークする必要があります -行が最初に発生しファイル名 -このファイルの行番号

これは、行に番号を付けてファイルをフォーマットするための私のコードです。

@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
4

3 に答える 3

0
@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.
)

スクリプトは を処理できますが!&<>|%、 は処理できません=

于 2013-04-19T14:07:15.247 に答える
0
@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

上記の Batch プログラムは、入力ファイルの空行を無視し、それらに! & < > |;などの特殊な Batch 文字が含まれていると失敗します。この制限は、必要に応じて修正できます。

于 2013-04-19T08:18:18.697 に答える