如何在命令行参数给出的一系列数字上并行使用 gnu

how to use gnu parallel over a range of numbers given by command-line arguments

我正在尝试将 gnu 与一些基本的生物信息学工具并行使用,例如最后。假设我有 10 个序列,我想对所有序列使用 lastz,我使用:

parallel --dryrun lastz 'pathToFile/seq{}.fa query.fasta --format=text > LASTZ_results_seq{}' ::: {1..10} 

效果很好 returns:

lastz pathToFile/seq1.fa query.fasta --format=text > LASTZ_results_seq1
lastz pathToFile/seq2.fa query.fasta --format=text > LASTZ_results_seq2
lastz pathToFile/seq3.fa query.fasta --format=text > LASTZ_results_seq3
...
lastz pathToFile/seq10.fa query.fasta --format=text > LASTZ_results_seq10

但理想情况下,我希望此步骤成为 bash 脚本的一部分,该脚本采用三个命令行参数,因此在命令中给出了 seqs 的数量(例如 1 到 10)-行($2 = startValue,$3 = endValue)。我认为将其更改为这样会起作用:

parallel --dryrun lastz 'pathToFile/seq{}.fa query.fasta --format=text > LASTZ_results_seq{}' ::: {""..""}

而是 returns

lastz pathToFile//seq\{..\} query.fasta --format=text > LASTZ_results_seq\{..\}

谁能告诉我我做错了什么?看起来它将 $2 解释为 1,将 $3 解释为 10,但随后未能将其视为数字范围...

Bash 范围不接受变量,请参见 post:

How do I iterate over a range of numbers defined by variables in Bash?

因此,我建议您将 {$1..$2} 更改为 $(seq $1 $2)。

举个例子,看这个测试脚本:

$ cat foo
parallel echo ::: {1..3}
parallel echo ::: {..}
parallel echo ::: $(seq  )

当调用 ./foo 1 3 时,它产生以下输出:

1
2
3
{1..3}
1
2
3

这不是您要问的,但它可能是更好的解决方案:

parallel --dryrun lastz {} query.fasta --format=text '>' LASTZ_results_{/.} ::: pathToFile/seq*.fa

如果你得到 Argument list too long 试试:

printf '%s\n' pathToFile/seq*.fa | parallel --dryrun lastz {} query.fasta --format=text '>' LASTZ_results_{/.} 

这样就不用提前知道seq*.fa有多少了