1

以下に示すように、ディレクトリ内の各ファイルの最後の行で新しいファイルを作成するために、この回答の一部を提供する以前の投稿を見つけました。

@echo off
for %%f in (*.log) do (
    set /a line_count = -1
    for /f %%l in (%%f) do set /a line_count += 1
    more +%line_count% %%f
)

ファイルが改行文字で終わらない場合、line_count 変数を -1 ではなく 0 に初期化する必要があります。

more の出力をリダイレクトして、結果をファイルに追加できます。

more +%line_count% %%f >> your_results_file

今私が助けを必要としているのは、最後の行が取得されている.txtファイルのファイル名を新しいファイルの行に追加する方法を見つけることです。したがって、各ファイルのファイル名の最後の行になります。ディレクトリで。

これは誰かが助けることができるものですか?ありがとうございました。

4

3 に答える 3

0

ファイル内の行数を数えるのに FOR ループを使用しないでください。遅くて信頼できません。空行をスキップし、EOL を無効にしない限り、EOL 文字で始まる行もスキップできます。

FIND /C行数のカウントに使用します。オプションを指定した空の検索文字列は、/Vすべての行に一致します。

SET /P を使用して、改行を発行せずにファイルの名前を出力します。

@echo off
setlocal enableDelayedExpansion
>output.txt (
  for %%F in (*.log) do (
    <nul set /p "=%%F: "
    for /f %%N in ('type "%%F"^|find /c /v ""') do set /a skip=%%N
    if !skip! gtr 0 set /a skip-=1
    more +!skip! "%%F"
  )
)

いずれかのファイル名に含まれる場合は!、遅延展開のオンとオフを切り替える必要があります

@echo off
setlocal disableDelayedExpansion
>output.txt (
  for %%F in (*.bat) do (
    set "file=%%F"
    setlocal enableDelayedExpansion
    <nul set /p "=!file!: "
    for /f %%N in ('type "!file!"^|find /c /v ""') do set /a skip=%%N
    if !skip! gtr 0 set /a skip-=1
    more +!skip! "!file!"
    endlocal
  )
)
type output.txt
于 2012-10-25T23:00:08.943 に答える
0

私の 2 つの例では、テキスト ファイルの最後の数行を別のファイルにコピーしませんが、そのために使用できます。

私の例は代わりに Linux コマンドのように機能し、TAIL代わりに最後の数行を表示します。

少し実験した結果、次の方法がファイルの最後の数行を表示する最速の方法であることがわかりました。もちろん、欠点はFOR空白行をスキップすることです。

TAIL.BAT

@echo off
setlocal enabledelayedexpansion
set "fn=%~1"
set "fn=%fn:(=^(%"
set "fn=%fn:)=^)%"
if "%~2"==""    set count=1
if "%~2" neq "" set count=%~2
(
  for /f "tokens=3" %%x in ('find /c /v "" %fn%') do set count=%%x
  set /a count=!count!-%count%
)
echo.
for /f "skip=%count% tokens=*" %%x in (%fn%) do echo %%x

%1ファイル名
%2は、表示するオプションの行数です。空白のままにするとTAIL.BAT、最後の行が表示されます。


FOR2 つの方法、 、または方法のどちらがより高速であったかを判断するためにMORE、次のように作成しました (コメントがたくさんあります)。自分でテストできるように含めます。

この例の大部分は経過時間の計算であることに注意してください。

TESTTAIL.BAT

@echo off
:: 
:: :::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: 
:: TAIL.BAT filename [linesToShow [/v]]
:: 
:: LINESTOSHOW = Number of lines at the end of the file
::               to display. If this is left blank TAIL
::               assumes that you only want the last line
::
:: /v          = Show the math, must be used with LINESTOSHOW
::               Without this switch, the time to complete
::               will be displayed, but not the math.
:: 

setlocal enabledelayedexpansion
set "fn=%~1"                   & :: Get File Name
set "fn=%fn:(=^(%"             & :: Escape Left  Brackets
set "fn=%fn:)=^)%"             & :: Escape Right Brackets
if "%~2"==""    set count=1    & :: Assume Last Line
if "%~2" neq "" set count=%~2  & :: Specify # of Lines to show

( :: Count Lines in File
  for /f "tokens=3" %%x in ('find /c /v "" %fn%') do set count=%%x
  :: Subtract # to skip from lines in file
  set /a count=!count!-%count%
)

:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
:: ::  Get last %Count% lines of file using MORE+  :: ::
:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
echo.
set start=%time%               & :: Get Start Time
more +%count% %fn%             & :: Show the last %count% lines
set end=%time%                 & :: Get End Time

call :Elapsed %end% %start% %3 & :: Calculate Time Elapsed

:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
:: ::   Get last %Count% lines of file using FOR   :: ::
:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
set start=%time%               & :: Get Start Time
for /f "skip=%count% tokens=*" %%x in (%fn%) do echo %%x
set end=%time%                 & :: Get End Time

call :Elapsed %end% %start% %3 & :: Calculate Time Elapsed

endlocal
goto :eof

:Elapsed
:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
::                Calculate Elapsed Time              ::
:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
echo.
if "%3"=="/v" ECHO        Start :  %1
if "%3"=="/v" ECHO        End   : -%2
if "%3"=="/v" ECHO                =============

for /f "tokens=1-8 delims=:.%tab% " %%a in ("%1 %2") do (
  set "hh= %%a - %%e "
  set "mm= %%b - %%f "
  set "ss= %%c - %%g "
  set "ms= %%d - %%h "
)

set   "hh=%hh: 0=%"
set /a hh=%hh%
set   "mm=%mm: 0=%"
set /a mm=%mm%
set   "ss=%ss: 0=%"
set /a ss=%ss%
set   "ms=%ms: 0=%"
set /a ms=%ms%

if %ms% lss 0 (
  set /a ms=100+%ms%
  set /a ss-=1
)
if %ss% lss 0 (
  set /a ss=60+%ss%
  set /a mm-=1
)
if %mm% lss 0 (
  set /a mm=60+%mm%
  set /a hh-=1
)
if %hh% lss 0 set /a hh=24+%hh%

if %hh% lss 10 set hh=0%hh%
if %mm% lss 10 set mm=0%mm%
if %ss% lss 10 set ss=0%ss%
if %ms% lss 10 set ms=0%ms%

echo Completed in :  %hh%:%mm%:%ss%.%ms%
echo.

goto :eof

上記のコードを私のマシンで実行した例を次に示します。最後の 5 行を指定していることに注意してください。

D:\Misc>testtail 2012-10-25(9).MIME 5 /v

MDAwMDAgbg0KMDAwMDA5NTQwOCAwMDAwMCBuDQp0cmFpbGVyDQo8PA0KL1NpemUgMzUNCi9Sb290
IDMzIDAgUg0KL0luZm8gMzAgMCBSDQovSUQgWzwxM0NBMjNBRjhFMTk2RkEyOTRGMThFM0I3QTJC
QkNFNj48N0I5OUE4NTkxOEE1MzgzQjY3NTY5OUMxNkFEQTA3RUQ+XQ0KPj4NCnN0YXJ0eHJlZg0K
OTcyNDMNCiUlRU9GDQo=
---915665055-1601124504-1351078287=:50774--

       Start :  15:30:57.11
       End   : -15:30:56.96
               =============
Completed in :  00:00:00.15

MDAwMDAgbg0KMDAwMDA5NTQwOCAwMDAwMCBuDQp0cmFpbGVyDQo8PA0KL1NpemUgMzUNCi9Sb290
IDMzIDAgUg0KL0luZm8gMzAgMCBSDQovSUQgWzwxM0NBMjNBRjhFMTk2RkEyOTRGMThFM0I3QTJC
QkNFNj48N0I5OUE4NTkxOEE1MzgzQjY3NTY5OUMxNkFEQTA3RUQ+XQ0KPj4NCnN0YXJ0eHJlZg0K
OTcyNDMNCiUlRU9GDQo=
---915665055-1601124504-1351078287=:50774--

       Start :  15:30:57.16
       End   : -15:30:57.15
               =============
Completed in :  00:00:00.01


D:\Misc>

ご覧のとおり、この 2 つの方法には大きな速度差があり、メソッドはFORよりも劇的に高速ですMORE

于 2012-10-28T20:21:53.117 に答える
0

あなたは出来る

@echo off
setlocal enabledelayedexpansion
for %%f in (*.log) do (
    set /a line_count = -1
    for /f "tokens=*" %%l in (%%f) do (
       set /a line_count += 1
       set value=%%l
       set file=%%f
    )
    echo line_count=%line_count% value=!value! file=!file!
)
于 2012-10-25T16:50:46.733 に答える