我有两个命令,我需要为两组数据重新运行16次。我标记了用作文件#a1_100.gen(设置1)和文件#a2_100.gen(设置2)的文件。然后将100替换为100到1600的倍数(100,200,......,1000,...,1600)。
示例1:对于第一组
命令1:perl myprogram1.pl file#a1.pos abc#a1.ref xyz#a1.ref file#a1_100.gen file#a1_100.out
命令2:perl my program2.pl file#a1_100.out file#a1_100.out.long
示例2:对于第一组
命令1:perl myprogram1.pl file#a1.pos abc#a1.ref xyz#a1.ref file#a1_200.gen file#a1_200.out
命令2:perl my program2.pl file#a1_200.out file#a1_200.out.long
对于第1组和第2组,这两个命令重复16次。对于第2组,文件名更改为文件#a2 ...
我需要一个可以自行运行的命令,方法是更改2组的文件名,每组运行16次。
任何帮助将不胜感激!谢谢!
答案 0 :(得分:0)
这可能是使用shell脚本最容易完成的。与Perl,TMTOWTDI一样 - 有不止一种方法可以做到这一点。
for num in $(seq 1 16)
do
perl myprogram1.pl file#a1.pos abc#a1.ref xyz#a1.ref file#a1_${num}00.gen file#a1_${num}00.out
perl myprogram2.pl file#a1_${num}00.out file#a1_${num}00.out.long
done
(您可以使用{1..16}
代替$(seq 1 16)
来生成数字。您可能还会注意到文件名中的#
字符会破坏SO Markdown系统。)
或者您可以使用:
for num in $(seq 100 100 1600)
do
perl myprogram1.pl file#a1.pos abc#a1.ref xyz#a1.ref file#a1_${num}.gen file#a1_${num}.out
perl myprogram2.pl file#a1_${num}.out file#a1_${num}.out.long
done
(我不认为那里有{...}
扩展。)
或者,更好的是,您可以使用变量来保存值以避免重复:
POS="file#a1.pos"
ABC="abc#a1.ref"
XYZ="xyz#a1.ref"
for num in $(seq 100 100 1600)
do
PFX="file#a1_${num}"
GEN="${PFX}.gen"
OUT="${PFX}.out"
LONG="${OUT}.long"
perl myprogram1.pl "${POS}" "${ABC}" "${XYZ}" "${GEN}" "${OUT}"
perl myprogram2.pl "${OUT}" "${LONG}"
done
在此代码中,参数名称周围的大括号都是可选的;在第一个代码块中,${num}
周围的大括号是强制性的,但在第二个大小写中是可选的。用双引号括起名字在这里也是可选的,但建议使用。
或者,如果你必须在Perl中这样做,那么:
use warnings;
use strict;
my $POS = "file#a1.ref";
my $ABC = "abc#a1.ref";
my $XYZ = "xyz#a1.ref";
for (my $num = 100; $num <= 1600; $num += 100)
{
my $PFX = "file#a1_${num}";
my $GEN = "${PFX}.gen";
my $OUT = "${PFX}.out";
my $LONG = "${OUT}.long";
system("perl", "myprogram1.pl", "${POS}", "${ABC}", "${XYZ}", "${GEN}", "${OUT}");
system("perl", "myprogram2.pl", "${OUT}", "${LONG}");
}
这都是非常基本的编码。你可以猜测,从最后一个shell脚本生成这个内容并没有花太多时间。请注意在system
调用中使用多个单独的字符串代替一个长字符串。这避免了运行shell解释器 - Perl直接运行perl
。
您可以使用$^X
代替"perl"
来确保运行与运行显示的脚本相同的Perl可执行文件。 (如果/usr/bin/perl
上有PATH
,但您运行$HOME/perl/v5.20.1/bin/perl thescript.pl
,则差异可能很重要,但可能不会。)