我有许多文本文件总是相同的行数 - 42并且每行总是相同类型的信息。此外,每一行都以标题开头。
我想要的是一个批处理脚本,以保持文本文件的第30行删除其他文件并保存文件。
我试图根据两行之间的信息查找该行。在这种情况下,第30行(工作注释)上的标题和第31行上的标题(工作号),然后将信息写入新文件。
第30行以
开头Job Notes= (information specifically about the job)
第31行以
开头Job Number=
这是我使用的代码(我在本网站的其他地方找到的代码),我根本没有输出。尝试了其他方法,所以如果你能看到更好的方法,就不必使用这种方法,基本上我只想让第30行成为文件中的唯一信息。
@ECHO OFF
SETLOCAL
SET "sourcedir=C\Batch"
SET "destdir=C:\Batch\Extract"
for /f "tokens=1 delims=[]" %%a in ('find /n "Job Notes"^<"%sourcedir%\7099.txt" ') do set /a start=%%a
for /f "tokens=1 delims=[]" %%a in ('find /n "Job Number"^<"%sourcedir%\7099.txt" ') do set /a end=%%a
(
for /f "tokens=1* delims=[]" %%a in ('find /n /v ""^<"%sourcedir%\00007099.txt" ') do (
IF %%a geq %start% IF %%a leq %end% ECHO(%%b
)
)>"%destdir%\newfile.txt"
GOTO :EOF
非常感谢任何帮助。 大卫
答案 0 :(得分:0)
您希望/N
标记为FINDSTR
:
FINDSTR /N /R ".*" *.txt | FINDSTR /R "\<30:" > out.txt
说明:
FINDSTR /N /R ".*" *.txt
在每个文本文件(".*"
)中查找每一行(/R
带有正则表达式标记*.txt
),并将其行号附加到前面(/N
)。然后将其传送到
FINDSTR /R "\<30:"
仅抓取以(\<
位)30:
开头的行。
答案 1 :(得分:0)
选项1,使用findstr字符串编号
for %%a in (*.log) do (
for /f "tokens=1,* delims=:" %%b in (
'findstr /n "^" "%%a" ^| findstr /b "30:"'
) do (
echo(%%c>"%%a"
)
)
选项2,用于命令跳过线
setlocal disabledelayedexpansion
for %%a in (*.log) do (
set "line="
for /f "usebackq skip=29 delims=" %%b in ("%%a") do if not defined line set "line=%%b"
setlocal enabledelayedexpansion
echo(!line!>"%%a"
endlocal
)
答案 2 :(得分:0)
@ECHO OFF
SETLOCAL
SET "sourcedir=C\Batch"
SET "destdir=C:\Batch\Extract"
for /f "skip=29tokens=1* delims==" %%a in ('type "%sourcedir%\7099.txt" ') do ECHO(%%b >"%destdir%\newfile.txt"&goto nextstep
:nextstep
GOTO :EOF
应该完成这项工作,找到第30行(跳过29),然后在分隔=
上进行标记并输出一个,然后进入批次中的下一步。
尽管如此,您确实意识到您正在使用start
设置end
和7099.txt
,然后从00007099.txt
中选择数据,不是吗? 00007099.txt
是否存在?
c:\batch
似乎是一个将数据文件存储给我的奇怪的地方。就个人而言,我将批处理文件放在那里(并将c:\batch
包含在您的PATH
中),但这是您的系统......