将数字拆分为间隔,并将它们转换为for循环中的两个变量

时间:2018-03-17 09:49:30

标签: bash

我想向群集提交一系列作业,我使用的是运行文件每一行的软件,但它可以选择定义行的间隔,以便您可以将其并行化。

命令行如下所示:

# 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的了解非常有限我尝试用{..}定义范围,但显然它不起作用

2 个答案:

答案 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