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

时间:2015-07-17 01:28:48

标签: bash command-line parallel-processing arguments gnu

我试图将gnu与一些基本的生物信息学工具并行使用,例如: LASTZ。所以说我有10个seqs,我想在所有这些上使用lastz,我使用:

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

哪个工作正常并返回:

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{}' ::: {"$2".."$3"}

但是,返回

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

有谁能告诉我我在这里做错了什么?看起来它将2美元解释为1,将3美元解释为10,但后来却没有将其视为一系列数字......

2 个答案:

答案 0 :(得分:5)

Bash范围不接受变量,请参阅以下文章:

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 ::: {$1..$2}
parallel echo ::: $(seq $1 $2)

当被称为./foo 1 3时,它产生以下输出:

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

答案 1 :(得分:0)

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

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。