@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q40441783.txt"
:: occurrence count for KEYWORD_1,KEYWORD_2,KEYWORD_3
FOR %%k IN (KEYWORD_1 KEYWORD_2 KEYWORD_3) DO (
FOR /f "delims=" %%c IN ('type "%filename1%"^|FIND /c "%%k"') DO ECHO %%k : %%c times
)
:: Timestamp display for KEYWORD_1,KEYWORD_2,KEYWORD_3
FOR %%k IN (KEYWORD_1 KEYWORD_2 KEYWORD_3) DO (
type "%filename1%"|FIND "%%k"
)
:: remove variables starting $ or #
For %%b IN ($ #) DO FOR /F "delims==" %%a In ('set %%b 2^>Nul') DO SET "%%a="
:: action - WRITE(#)
FOR /f "usebackqtokens=1*delims=- " %%a IN ("%filename1%") DO (
REM interested in "pattern - WRITE(#) start/end"
FOR /f "tokens=1-3*delims=-()" %%A IN ("%%b") DO (
REM %%A is action, %%B "WRITE" %%C # %%D " start"/" end"
IF "%%B"==" WRITE" IF "%%D"==" start" SET "$%%C %%A$=%%a"
IF "%%B"==" WRITE" IF "%%D"==" end" SET "#%%C %%A#=%%a"
CALL :formatch&CALL :report "WRITE(%%C)"
)
)
SET $ 2>nul
SET # 2>nul
:: remove variables starting $ or #
For %%b IN ($ #) DO FOR /F "delims==" %%a In ('set %%b 2^>Nul') DO SET "%%a="
FOR /f "usebackqtokens=1*delims=- " %%a IN ("%filename1%") DO (
REM interested in "ACTION_A/ACTION_B elapsed time"
FOR /f "tokens=1*delims=- " %%A IN ("%%b") DO (
REM %%A is action, %%B remainder of line
IF "%%A"=="ACTION_A" SET "$1$=%%a"&SET "_actiona=%%B"
IF "%%A"=="ACTION_B" SET "#1#=%%a"
CALL :formatch
CALL :report "%%_actiona%% %%B"
)
)
SET $ 2>nul
SET # 2>nul
GOTO :EOF
:: See whether a $something$ AND a #something# exist and report if so
:formatch
SET "elapsed="
FOR /f "tokens=1,2delims=$=" %%m IN ('set $ 2^>nul') DO (
IF DEFINED #%%m# (
CALL :elapsed %%n %%#%%m#%%
SET "#%%m#="
SET "$%%m$="
)
)
GOTO :eof
:report
IF DEFINED elapsed ECHO %elapsed% %~1
GOTO :eof
:: get %2 - %1 both in HH:mm.ss.ttt format
:elapsed
FOR /f "tokens=1-4delims=:." %%w IN ("%2") DO (SET /a hh=2%%w&SET /a mm=2%%x&SET /a ss=2%%y&SET /a ttt=2%%z)
FOR /f "tokens=1-4delims=:." %%w IN ("%1") DO (SET /a hh-=1%%w&SET /a mm-=1%%x&SET /a ss-=1%%y&SET /a ttt-=1%%z)
:: compensate for "negatives"
IF %ttt% lss 1000 set/a ttt+=1000&set/a ss-=1
IF %ss% lss 100 set/a ss+=60&set/a mm-=1
IF %mm% lss 100 set/a mm+=60&set/a hh-=1
IF %hh% lss 100 set/a hh+=24
SET "elapsed=%hh:~-2%:%mm:~-2%:%ss:~-2%.%ttt:~-3%"
GOTO :eof
GOTO :eof
您需要更改sourcedir的设置以适合您的情况。
我使用了一个名为q40441783.txt的文件来进行测试,其中包含您的数据。在
有趣的练习。在
前两个步骤相当明显。我加入了KEYWORD_3,以确保为“未找到”生成正确的报告。请注意,您声明关键字“1”出现了2次。实际上,在你发布的数据中有3个。在
下一步需要一些解释。我要做的第一件事是确保没有以#或$开头的变量。在
下一步-分析每一行,首先在第一个-或空格上拆分,然后处理第一个分隔符序列标记在-()上的部分,以便标记如REM语句中所述。然后我们将变量$...$或#...#设置为%%a中的时间。...这是日志条目的唯一部分-编号和操作。然后检查同一个$...$和{},如果是,清除$#...$#变量,计算运行时间,重建行并报告。在
运行时间计算在每个变量的开始前加上2,以确保它们不会启动0,并且可能被视为八进制。然后用减去开始时间的方法,用一个预先加上1的数字来产生一个应该是3位数(4代表毫秒)的结果。如果检测到的位数较少,则需要添加一个适当的数字,并从下一个较高的时间元素中扣除一个。在
动作“a”/“b”计时的处理基本相同,但以$记录开始/结束时间!$/#1#因为没有指示字符串action_a和{}的性质,因此我们不得不假设适当的事件不会重叠。在