Batch file 批处理以分析包含输入文件中特定字符串的行

Batch file 批处理以分析包含输入文件中特定字符串的行,batch-file,Batch File,编辑:是的,这必须批量完成 我需要能够读取输入文件,并且只解析出包含特定字符串的行的某些部分,然后将其写入输出文件。例如: 输入= i_NumberOfPersonInTheDataBase=1 i_NumberOfPersonInTheDataBase < 50 AdjTotal=801 MATCH IdentificationResult id=Olivier Score=11419 (NOT_DEFINED-cfv ) 02-11-11-07-00 TAG_CAPTURE Badge

编辑:是的,这必须批量完成

我需要能够读取输入文件,并且只解析出包含特定字符串的行的某些部分,然后将其写入输出文件。例如:

输入=

i_NumberOfPersonInTheDataBase=1
i_NumberOfPersonInTheDataBase < 50 AdjTotal=801
MATCH IdentificationResult id=Olivier Score=11419 (NOT_DEFINED-cfv )
02-11-11-07-00 TAG_CAPTURE Badge:CAPTURE - Candidate Found :Olivier
i_NumberOfPersonInTheDataBase=1
i_NumberOfPersonInTheDataBase < 50 AdjTotal=801
MATCH IdentificationResult id=Martin Score=1008 (NOT_DEFINED-cfv )
02-11-11-08-15 TAG_CAPTURE Badge:CAPTURE - Candidate Found :Martin
这就是我到目前为止所做的:

@setlocal enableextensions enabledelayedexpansion

:: Path of input and output files
set INPUTFILE=DemoFingerOtf-2.log
set OUTPUTFILE=logOutput.txt

:: Clear out the output file
@echo on > %OUTPUTFILE%

:: Read %INPUTFILE% and loop through each line
for /F "tokens=* delims=" %%A in (%INPUTFILE%) do (
    SET my_line=%%A
    SET my_line=!my_line:IdentificationResult=!
    if not !my_line!==%%A (
     call :parse_it
  )   
)

:parse_it
for /F "usebackq tokens=1,2,3,4 delims=~" %%1 in ('%my_line: =~%') do (
    echo %%3 %%4>> %OUTPUTFILE%
)
我现在遇到的问题是,当我运行这个脚本时,我得到了一个”)在这个时候是意外的错误。当我从输入中删除括号时,我得到了预期的结果。我试着用下面这样的一行删除括号:

:: Read %INPUTFILE% and loop through each line
for /F "tokens=* delims=" %%A in (%INPUTFILE%) do (
    SET my_line=%%A
    SET my_line=!my_line:IdentificationResult=!
    if not !my_line!==%%A (
     SET new_line=%my_line:~0,-18%
     call :parse_it
  )   
)

:parse_it
for /F "usebackq tokens=1,2,3,4 delims=~" %%1 in ('%new_line: =~%') do (
    echo %%3 %%4>> %OUTPUTFILE%
)
我知道在我想要的行中,带括号的部分总是正好是18个字符,所以我从末尾修剪它们。但是,当我这样做时,出于某种原因,我得到以下输出:

错误输出:

id=Olivier Score=11419
id=Olivier Score=11419
id=Olivier Score=11419

因此,我只从我想要解析的第一行中获取数据,并且获取了三次(即使在我的输入中只有两行符合我的条件)。为什么我多次获取这些数据而不是正确的数据?另外,有没有更好的方法来解决我在这个时候遇到的意外错误?

你不说你想要什么语言。那么你能做些类似的事情吗

grep IdentificationResult file | awk '{ print $3, $4}' > output.file

编辑修改后的内容,不带尾随空格。没有“分数调整”并与“约翰·史密斯”合作:

@ECHO OFF&SETLOCAL
对于/f“delims=“%%a in(”^简单方法:

    if not !my_line!==%%A (
     ECHO !my_line:~7,-19!>> %OUTPUTFILE%
    )   
您的代码有一些问题,但我赞扬您为解决这个问题所做的努力

批次不会在标签处停止-它们只是标记,所以它会直接充电,因此您需要一个标签

goto :eof
在任何子例程标签之前

您不能将数字用作元变量,因此在
parse_it
中,您需要一个字母,而不是
1
。您也可以将空格用作
delims
字符,但必须将其指定为最后一个分隔符(即,在结束之前)

因此,
parse_it
可以减少(如果需要的话)到


但是-总的来说,这次尝试太棒了!

这个问题被标记为
batch file
,他的代码是Windows batch,所以他大概想要Windows batch语言。是的,它必须批量完成。我将在主帖子中编辑它。
grep
awk
可用于Windows cmd命令shell。据我所知,gr默认情况下,ep在Windows中不可用,最终用户可能无权访问。这比我所做的要简单得多,但我不完全理解这里发生的事情。具体来说,是什么控制%%a和%%b中存储的值?只需使用
“tokens=2,3 delims即可==(“
,不需要插入符号。而且您的输出在每一行都有一个尾随空格。%%a(标记2)取“=”(delims^=)分隔符[Olivier Score]和%%b(标记3)之间的值,取“)”(delims^))[11419]之前的值,这就是为什么我在“%%a之前,=”之后加上“Id=”以获得正确的输出:)是,在左括号之前包含一个空格!不适合我:)但你不能称之为
正确的输出。空间是一对多:)这并不能回答我的问题,但这个解决方案非常有效。谢谢事实上,我遇到了一个问题。有些数据在“id”字段中有空格,因此我的输出是
id=John Smith
,而不是
id=John Smith Score=1337
。是否有解决方案可以解决此问题?请参阅我的代码的新编辑。它现在适用于您的所有情况:)最好在这里使用正则表达式:)
grep
sed
或混合
batch/basic
之类的脚本。@sachadee使生活更轻松、更愉快。感谢您真正回答了我的问题,而不是给我一个不同的解决方案。我将使用另一种解决方案,因为我的输入文件很大,而且速度快得多,但我感谢您解释了我的一些错误。
@ECHO OFF &SETLOCAL
for /f "delims=" %%a in ('^<file find "IdentificationResult"') do call:DOit "%%~a"
goto:Eof

:doit
setlocal
set "string=%~1"
set "STring=%string:*IdentificationResult=%"
for /f "Tokens=1,2" %%b in ("%string%") do echo(%%b %%c
exit /b
    if not !my_line!==%%A (
     ECHO !my_line:~7,-19!>> %OUTPUTFILE%
    )   
goto :eof
for /F "tokens=1* delims= " %%q in ("%new_line%") do (
    echo %%r>> %OUTPUTFILE%
)