我想在多个ID上多次运行相同的bash脚本。
这是我正在谈论的剧本:
#!/bin/bash
export PATH=/diag/software/bin:$PATH
cd /diag/cloud/udevisetty/RIL_stuff/Block_01
fq_dir="/diag/cloud/udevisetty/RIL_stuff/Block_01"
map_dir="/diag/cloud/udevisetty/RIL_stuff/mapping/"
for RIL in $(cat /diag/cloud/udevisetty/RIL_stuff/Block_01/test.txt); do
for lane in 01; do
perl /diag/cloud/udevisetty/RIL_stuff/Block_01/bwa_tophat_final.pl \
--threads 12 \
--out $map_dir/$RIL.$lane \
--bwa_n 0.04 \
--bwa_db /diag/home/udevisetty/db/Brapa_sequence_v1.5.fa \
--fq $fq_dir/$RIL/*fq \
--fq_id $RIL.$lane \
--bowtie_db /diag/home/udevisetty/db/Brapa_sequence_v1.5.fa \
--ref_fa /diag/home/udevisetty/db/Brapa_sequence_v1.5.fa \
--ref_id Brapa_v1.5 \
> $map_dir/$RIL.$lane.bwa_tophat.log \
2> $map_dir/$RIL.$lane.bwa_tophat.err
done;
done
我的测试文件包含以下ID
RIL_251
RIL_21
RIL_211
RIL_136
RIL_66
RIL_155
但是现在它所做的只是遍历test.txt文件中的每个ID(因为它是'for'循环),然后一次执行一个脚本。但是我想在12个线程上同时运行所有ID。如何修改我的脚本来做到这一点?
答案 0 :(得分:0)
一个人为的例子说明了如何用'xargs'来做到这一点:
root# cat id.txt | xargs -n 1 -P 3 ./script.sh
id2
id1
id4
id3
id5
id7
id6
id.txt的内容,请注意它的订购。
root# cat id.txt
id1
id2
id3
id4
id5
id6
id7
脚本内容:
root# cat script.sh
#!/bin/bash
echo $1
如果可用here
,您还可以使用GNU Parallel答案 1 :(得分:0)
总结:
while read -u 3 -r line; do
process "$line" &
done 3< input.txt
这遵循BashFAQ #001最佳实践方法从文件中读取行(使用FD 3避免重新分配stdin的描述符),并使用&
运算符来处理每个进程。