用于针对文件夹和分段数据库中的所有文件名运行bat脚本以及合并输出

时间:2016-09-16 16:53:52

标签: python perl batch-file cmd

我在一个名为' seq'的文件夹中有一个随机数字(随机名称)的.txt文件。为:

NP_4500.1.txt
NP_4568.1.txt
NP_45981.3.txt
XM_we679.txt
36498746.txt

在另一个名为' db'的文件夹中,我将数据库分成20段(由于我的计算限制),其排列如下:

hg.part-01.db
hg.part-02.db
hg.part-03.db
..
..
hg.part-20.db

现在我想在每个.txt文件中针对每个碎片数据库运行以下命令并生成碎片化结果,就像一个.txt文件(NP_4500.1.txt):

script.exe ./seq/NP_4500.1.txt -db ./db/hg.part-01.db -out NP_4500.1_part-01.out
script.exe ./seq/NP_4500.1.txt -db ./db/hg.part-02.db -out NP_4500.1_part-02.out
script.exe ./seq/NP_4500.1.txt -db ./db/hg.part-03.db -out NP_4500.1_part-03.out
...
...
script.exe ./seq/NP_4500.1.txt -db ./db/hg.part-20.db -out NP_4500.1_part-20.out

之后,我想将结果合并到一个文件中:

join NP_4500.1_part-001.out NP_4500.1_part-002.out .. NP_4500.1_part-00200.out > NP_4500.1.out

类似于下一个.txt文件:

NP_4568.1.txt

...

现在,我可以为每个.txt文件运行cmd脚本:

for %%F in ("*.txt") do script.exe ./seq/%%F .......

但我的问题是,如何将此命令与每个碎片数据库集成并合并.out文件以生成单个.txt文件的结果,然后再继续下一个。

我正在使用Windows 7(32位机器)。我可以使用cmd,perl或python脚本。谢谢你的考虑。

1 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
FOR /f "delims=" %%a IN (
 'dir /b /a-d "%sourcedir%\*.txt" '
 ) DO (
 SET "join="
 FOR /L %%d IN (101,1,120) DO (
  SET /a segment=%%d
  SET "segment=!segment:~-2!"
  ECHO(script.exe %sourcedir%\%%a -db .\db\hg.part-!segment!.db -out %%~na_part-!segment!.out
  SET "join=!join! %%~na_part-!segment!.out"
 )
 ECHO(join !join! ^>%%~na.out
)


GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

请注意,在windows中,目录分隔符为\ - ' /`是一个开关指示符。

外部for依次将每个文件名分配给%%a

%%d依次分配100..120。这已分配给segment,然后仅使用segment的最后2个字符。

然后为每个段运行script.exejoin字符串构建每个.out文件名。

最后,执行join命令。

所需命令仅用于ECHO以用于测试目的。 在您确认命令正确之后,删除在命令实际执行命令之前出现的字符串ECHO(。您还需要将最终^>中的echo更改为> - 插入符号>的特殊含义是为了echo

%~na象形文字仅表示%%a

中字符串的名称部分