我在两个不同的目录中有一组以下格式的文件。
LS-2bit_a0_c0_apple_p1.log
LS-2bit_a0_c0_apple_p1.txt
LS-2bit_a0_c0_apple_p2.log
LS-2bit_a0_c0_apple_p2.txt
LS-2bit_a0_c0_mango_p1.log
LS-2bit_a0_c0_mango_p1.txt
LS-2bit_a0_c0_mango_p2.log
LS-2bit_a0_c0_mango_p2.txt
LS-2bit_a0_c0_grape_p1.log
LS-2bit_a0_c0_grape_p1.txt
LS-2bit_a0_c0_grape_p2.log
LS-2bit_a0_c0_grape_p2.txt
LS-2bit_a0_c1_apple_p1.log
LS-2bit_a0_c1_apple_p1.txt
LS-2bit_a0_c1_apple_p2.log
LS-2bit_a0_c1_apple_p2.txt
LS-2bit_a0_c1_mango_p1.log
LS-2bit_a0_c1_mango_p1.txt
LS-2bit_a0_c1_mango_p2.log
LS-2bit_a0_c1_mango_p2.txt
LS-2bit_a0_c1_grape_p1.log
LS-2bit_a0_c1_grape_p1.txt
LS-2bit_a0_c1_grape_p2.log
LS-2bit_a0_c1_grape_p2.txt
,顺序如下:c0,c1,c2等。我想按段读取文件并分别对每组文件执行操作。 (例如,仅使用C0_apple检索所有文件。但是它输出所有苹果文件(例如c0_apple,c1_apple,C2_apple ......)
我是批处理脚本的新手并尝试了以下内容。
@echo off
setlocal enabledelayedexpansion
SET PATH=%PATH%;c:\windows\system32
for /f %%a in ('dir /on /ad /b') do (
cd %%a
for %%b in (LS-2bit*) do (
call :fun1
)
:fun1
for %%b in (*a0*) do (
call :fun2
)
:fun2
for %%b in (*C0*) do (
call :fun3
)
:fun3
for %%b in (*apple*) do (
call :fun4
)
for %%b in (*p1.log, *p1.txt, *p2.log *p2.txt) do (
echo %%b
)
cd..
)
很抱歉不太清楚。这正是我需要做的。这是一个庞大的数据集。我需要对每组进行分组(例如,c0_apple_ *,c1_apple,c2_apple,c0_mango,c1_mango,c2_mango等等,就像近15组水果一样)。每组包含4个日志文件(p1,p2,p3,p4)和4个文本文件(p1,p2,p3,p4)。我需要从日志文件中检索平均值并从文本文件中对速率值进行检索并将它们存储在一个单独的文件中。(日志文件值和文本文件值可以在同一个输出文件中)所以每个集合(c0_apple都有一个输出文件, c1_apple有一个输出文件......)。我在旧代码中使用以下函数进行了retreiving值。
`for %%b in (*p1* *p2*) do(
type %%b | find " bit " >> new1.txt
)
for /f "tokens=3" %%d in (new1.txt) do (
echo %%d > temp.txt
for /f "delims=." %%r in (temp.txt) do (
echo | set /p = %%r %tab% >> hmlog.txt
del temp.txt
)
)
and
for %%b in (*p1* *p2*) do(
type %%b | find "Average" >> new.txt
)
for /f "tokens=2" %%b in (new.txt) do (
echo %%b >> hmtxt.txt
)`
然而,现在的问题是,由于数据量很大,有没有办法循环遍历文件夹以获取每组数据并在每次迭代期间生成输出文件?
答案 0 :(得分:0)
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
for /f "delims=" %%a in ('dir /on /ad /b "%sourcedir%"') do (
PUSHD "%sourcedir%\%%a"
DIR /b /a-d *LS-2bit*a0*c0*apple*p*.log *LS-2bit*a0*c0*apple*p*.txt
echo \\\\
for %%b in (*LS-2bit*a0*c0*apple*p1*.log *LS-2bit*a0*c0*apple*p1*.txt
*LS-2bit*a0*c0*apple*p2*.log *LS-2bit*a0*c0*apple*p2*.txt) do (
ECHO %%b
)
echo ++++
for %%b in (LS-2bit) do (
for %%c in (a0) do (
for %%d in (C0) do (
for %%e in (apple) do (
for %%n in (p1 p2) DO FOR %%x IN (log txt) do (
IF EXIST "%%b*%%c*%%d*%%e*%%n.%%x" ECHO(%%b*%%c*%%d*%%e*%%n.%%x
)
echo ----
for %%n in (p1 p2) DO FOR %%x IN (log txt) do (
DIR /b /a-d "%%b*%%c*%%d*%%e*%%n.%%x"
)
echo ====
PAUSE
)
)
)
)
POPD
)
ECHO done
pause
GOTO :EOF
目前还不清楚你想做什么。
当标签终止块时,块语句(a parenthesised series of statements)
与标签不能很好地匹配。
在*
循环中使用包含?
或for
的字符串使字符串成为文件名 - 要按字面意思使用字符串,您需要先将其括在引号中,如{{ 1}}然后当它被分配给元变量"*c0*"
时,使用%%X
提取它。
使用固定文字%%~X
,LS-2bit
,a0
,c0
等似乎没什么意义。您没有解释您的批次的意图做,所以我们猜测领域。也许您可以将其作为子例程运行,其中这些元素将作为参数提供(在这种情况下,用apple
,%~1
替换每个固定字符串等。
以下是生成文件列表的四种不同方法。不知道你更喜欢哪个......
答案 1 :(得分:0)
编辑:此问题中的原始请求已更改,因此我需要相应地更改我的解决方案。但是,没有公布有关新问题的明确规范,因此我需要猜测我将用于开发新程序的规范。他们在这里:
在目录中有一组具有此名称格式的文件:
LS-2bit_a0_c#_fruit_p#.txt
LS-2bit_a0_c#_fruit_p#.log
其中LS-2bit_a0
部分已修复; c#
部分因c0,c1和c2而异; fruit
部分超过15种不同的水果组(如“苹果”,“芒果”,“葡萄”等);和p#部分从p1到p4不等。
* .txt文件各有几行,其中一行的格式为以下格式:
Rate bit ###.##
* .log文件各有几行,其中一行的格式为平均值:
Average ###
程序必须将4 * .txt文件中的数据和对应于相同c#_fruit
组合的4 * .log文件进行分组,并将它们存储在c#_fruit.out
的同一输出文件中名称。每个输出文件必须包含以下两行:
RateP1 RateP2 RateP3 RateP4
AvgeP1 AvgeP2 AvgeP3 AvgeOP4
...其中RateP#是* .txt文件中“bit”之后的数字的整数部分,而AvgeP#是* .log文件中“Average”之后的数字;值必须用TAB字符分隔。
以下程序符合这些规范:
@echo off
setlocal EnableDelayedExpansion
rem Group rate data from 4 *.txt files in its corresponding "c#_fruit.out" output file
set "i=0"
set "line="
for /F "tokens=3,4,8 delims=_. " %%a in ('findstr /C:" bit " *.txt') do (
rem Insert here v a TAB character
set "line=!line! %%c"
set /A i+=1
if !i! equ 4 (
> %%a_%%b.out echo !line:~1!
set "i=0"
set "line="
)
)
rem Group average data from 4 *.log files in its corresponding "c#_fruit.out" output file
for /F "tokens=3,4,6 delims=_ " %%a in ('findstr "Average" *.log') do (
rem Insert here v a TAB character
set "line=!line! %%c"
set /A i+=1
if !i! equ 4 (
>> %%a_%%b.out echo !line:~1!
set "i=0"
set "line="
)
)
输出示例:
C:\> type *.out
c0_apple.out
123 456 789 987
111 222 333 444
c0_mango.out
123 456 789 987
111 222 333 444
c1_apple.out
123 456 789 987
111 222 333 444
c1_mango.out
123 456 789 987
111 222 333 444