我想向群集提交一系列作业,我使用的是运行文件每一行的软件,但它可以选择定义行的间隔,以便您可以将其并行化。
命令行如下所示:
# Run MetaTissueMM (Mixed Model) to obtain estimates of effects
~/Meta-Tissue/Meta-Tissue.v.0.5/./MetaTissueMM \
--expr ~/Meta-Tissue/output_gene.txt \
--geno /~Meta-Tissue/output_snp.txt \
--matrix ~/Meta-Tissue/matrix.txt \
--output ~/Meta-Tissue/MetaTissue \
--start_snp_index 0 \
--end_snp_index 1000
我要修改的变量是--start_snp_index
和--end_snp_index
,我的文件有8743544行,所以我想将它们分成1000个间隔,因此这两个选项将是--start_snp_index 0 --end_snp_index 1000 --start_snp_index 1001 --end_snp_index 2000
等等。
我对bash的了解非常有限我尝试用{..}
定义范围,但显然它不起作用
答案 0 :(得分:1)
您可以使用简单的计数循环:
lines=8743544
for ((start = 0; start <= lines; start += 1000)); do
prog --start_snp_index $start --end_snp_index $((start + 999))
done
在Bash 4中,大括号扩展允许指定增量,因此您可以使用:
for start in {0..8743544..1000}; do
prog --start_snp_index $start --end_snp_index $((start + 999))
done
请注意,我不是这个大括号扩展的忠实粉丝,因为它不允许在{..}
表达式中使用变量。
答案 1 :(得分:0)
这样的事情:
#!/bin/bash
for a in {0..8744}
do
MetaTissueMM --foo --bar --start_snp_index $((a*1000)) --end_snp_index $(((a+1)*1000))
done