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,但后来却没有将其视为一系列数字......
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)
这不是您要问的,但这可能是更好的解决方案:
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 。