【环境】
os:win2k en server
dos窗口:cmd.exe
for命令:系统自带
findstr命令:系统自带
gnu_sed命令:v4.14
super_sed命令:v3.62 (based on gnu_sed v4.1)
【附件】
fi20.bat:for/f命令批处理
fi21.bat:findstr命令批处理
fi22.bat:sed命令批处理
fi23.bat:ssed命令批处理
批处理均使用cadv作为参数执行,即:fi20.bat cadv
cadvfi25.log:批处理调用的数据文件
cadvfi21.csv:批处理调用的数据文件
cadvfi25_t.log:内容与cadvfi25.log基本一致,仅“\”改为“\\”,供findstr,sed调用。
cadvfi23.csv:批处理进行文本匹配生成的数据文件。
cadvfi23.csv_for:与各比较命令批处理相对应的结果数据文件,供检验正确性用。
cadvfi23.csv_findstr:与各比较命令批处理相对应的结果数据文件,供检验正确性用。
cadvfi23.csv_sed:与各比较命令批处理相对应的结果数据文件,供检验正确性用。
cadvfi23.csv_ssed:与各比较命令批处理相对应的结果数据文件,供检验正确性用。
【目的】
比较for命令,findstr命令,与sed命令对文本内容进行匹配的速度,从而择优选用与学习。
【测试方式】
对于相同的内容分别测试上述三个命令进行文本匹配的速度三次,取平均值。
使用for命令的测试批处理:- REM 测试文件匹配的方式与速度
- REM Date:[2008-10-11 14:27:52] Author:nh_wzg
- :BEGIN
- ::File notes...
- @echo off
- cls&echo.
- Title [For command in the match operation]
- echo [For command in the match operation]
- :INIT
- echo [批处理执行初始化(Batch Initializing...)]
- echo.
- set t=%time%
- :MATCH
- set /p =[匹配压缩文件与解压文件信息的对应关系并输出 ... <nul
- echo md51,fullpath_filename,path,fullname1,fullname2,md52,name2,ext2,size2,ts2,tu,tc,>%1fi23.csv
- setlocal enabledelayedexpansion
- for /f "skip=2 tokens=2,4 delims= " %%l in (%1fi25.log) do (
- set v1=%%l
- for /f "skip=1 tokens=1-11 delims=," %%a in (%1fi21.csv) do (
- if /i %%l==%%b (
- set aa=%%a
- set bb=%%b
- set cc=%%c
- set dd=%%d
- REM ----------------------------------------------------------------------
- REM findstr /v /c:%%b %1tfi21.csv >t21.csv
- REM move /y t21.csv %1tfi21.csv
- REM ----------------------------------------------------------------------
- )
- )
- echo !aa!,!bb!,!cc!,!dd!,>>%1fi23.csv
- set aa=
- set bb=
- set cc=
- set dd=
- )
- endlocal
- set /p =Done!]<nul
- echo.
- echo.
- echo Command start: %t%
- echo Command end: %time%
- echo.
- echo.
- :END
- pause::[Press Any Key to Exit...]&echo.
复制代码 使用findstr命令的测试批处理:- REM 测试文件匹配的方式与速度
- REM Date:[2008-10-11 14:55:39] Author:nh_wzg
- :BEGIN
- ::File notes...
- @echo off
- cls&echo.
- Title [Findstr command in the match operation]
- echo [Findstr command in the match operation]
- echo.
- :INIT
- echo [批处理执行初始化(Batch Initializing...)]
- echo.
- set t=%time%
- :MATCH
- set /p =[匹配压缩文件与解压文件信息的对应关系并输出 ... <nul
- echo md51,fullpath_filename,path,fullname1,fullname2,md52,name2,ext2,size2,ts2,tu,tc,>%1fi23.csv
- setlocal enabledelayedexpansion
- for /f "skip=2 tokens=2,4 delims= " %%l in (%1fi25_t.log) do (
- set v1=%%l
- for /f "usebackq tokens=1-11 delims=," %%a in (`findstr /i "%%l" %1fi21.csv`) do (
- set aa=%%a
- set bb=%%b
- set cc=%%c
- set dd=%%d
- REM ----------------------------------------------------------------------
- REM findstr /v /c:%%b %1tfi21.csv >t21.csv
- REM move /y t21.csv %1tfi21.csv
- REM ----------------------------------------------------------------------
- )
- echo !aa!,!bb!,!cc!,!dd!,>>%1fi23.csv
- set aa=
- set bb=
- set cc=
- set dd=
- )
- endlocal
- set /p =Done!]<nul
- echo.
- echo.
- echo Command start: %t%
- echo Command end: %time%
- echo.
- echo.
- :END
- pause::[Press Any Key to Exit...]&echo.
复制代码 使用sed命令的测试批处理:- REM 测试文件匹配的方式与速度
- REM Date:[2008-10-11 14:55:39] Author:nh_wzg
- :BEGIN
- ::File notes...
- @echo off
- cls&echo.
- Title [GNU_sed v4.14 command in the match operation]
- echo [GNU_sed v4.14 command in the match operation]
- echo.
- :INIT
- echo [批处理执行初始化(Batch Initializing...)]
- echo.
- set t=%time%
- :MATCH
- set /p =[匹配压缩文件与解压文件信息的对应关系并输出 ... <nul
- echo md51,fullpath_filename,path,fullname1,fullname2,md52,name2,ext2,size2,ts2,tu,tc,>%1fi23.csv
- setlocal enabledelayedexpansion
- for /f "skip=2 tokens=2,4 delims= " %%l in (%1fi25_t.log) do (
- set v1=%%l
- for /f "usebackq tokens=1-11 delims=," %%a in (`sed -n "/%%l,/Ip" %1fi21.csv`) do (
- set aa=%%a
- set bb=%%b
- set cc=%%c
- set dd=%%d
- REM ----------------------------------------------------------------------
- REM findstr /v /c:%%b %1tfi21.csv >t21.csv
- REM move /y t21.csv %1tfi21.csv
- REM ----------------------------------------------------------------------
- )
- echo !aa!,!bb!,!cc!,!dd!,>>%1fi23.csv
- set aa=
- set bb=
- set cc=
- set dd=
- )
- endlocal
- set /p =Done!]<nul
- echo.
- echo.
- echo Command start: %t%
- echo Command end: %time%
- echo.
- echo.
- :END
- pause::[Press Any Key to Exit...]&echo.
复制代码 【结果】
在我的机器上面的测试的结果是:findstr(2.95s)》gnu_sed(8.08s)》for /f(8.21s),结果对功能超强的gnu_sed来说,不免会让人失去学习的动力。但是如果对使用sed的批处理稍作修改,使用super_sed v3.62(ssed.exe),结果是惊人的ssed(1.19s)。
可见在一般的情况下面,使用findstr是比较方便的,不仅因为它快,还因为它是随系统自带的。
但sed也值得我们去仔细学习一下,功能太多了,但是为了速度,也许我们要对它的版本作个选择。
[ 本帖最后由 nh_wzg 于 2008-10-11 17:53 编辑 ] |