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

giz*_*zmo 5 parallel-processing bash command-line arguments gnu

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

parallel --dryrun lastz 'pathToFile/seq{}.fa query.fasta --format=text > LASTZ_results_seq{}' ::: {1..10} 
Run Code Online (Sandbox Code Playgroud)

哪个工作正常并返回:

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
Run Code Online (Sandbox Code Playgroud)

但理想情况下,我希望这一步是bash脚本的一部分,它需要三个命令行参数,所以seqs的数量(例如1到10)在命令行中给出($ 2 = startValue,$ 3 = endValue值).我认为改变它可以工作:

parallel --dryrun lastz 'pathToFile/seq{}.fa query.fasta --format=text > LASTZ_results_seq{}' ::: {"$2".."$3"}
Run Code Online (Sandbox Code Playgroud)

但相反,返回

lastz pathToFile//seq\{\1..\10\} query.fasta --format=text > LASTZ_results_seq\{\1..\10\}
Run Code Online (Sandbox Code Playgroud)

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

pas*_*qui 6

Bash范围不接受变量,请参阅此帖子:

如何迭代Bash中变量定义的一系列数字?

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

例如,请参阅此测试脚本:

$ cat foo
parallel echo ::: {1..3}
parallel echo ::: {$1..$2}
parallel echo ::: $(seq $1 $2)
Run Code Online (Sandbox Code Playgroud)

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

1
2
3
{1..3}
1
2
3
Run Code Online (Sandbox Code Playgroud)

  • `seq $ 1 $ 2 | parallel echo`#如果参数的数量大于shell行可以适合的话,以避免出现问题 (3认同)

Ole*_*nge 1

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

parallel --dryrun lastz {} query.fasta --format=text '>' LASTZ_results_{/.} ::: pathToFile/seq*.fa
Run Code Online (Sandbox Code Playgroud)

如果你Argument list too long尝试:

printf '%s\n' pathToFile/seq*.fa | parallel --dryrun lastz {} query.fasta --format=text '>' LASTZ_results_{/.} 
Run Code Online (Sandbox Code Playgroud)

这样你就不需要提前知道有多少个 seq*.fa 。