但是,这不会遍历所有文件,并且似乎卡在 10 号染色体上。
我担心循环内的循环会太慢。
你确定这是for filename in *.vcf.gz
循环所有文件的速度太慢吗?
尝试放一个echo
之前vcftools
,看看它是否仍然卡住。
您需要确定什么需要花费太多时间才能做出正确的选择。
例如,如果vcftools
您可能不需要等待此命令结束并考虑进行一些异步处理。
如果一个循环的文件太多,您还应该考虑进行一些并行处理。
此外,您似乎对所有.vcf.gz
文件重复循环两次。反转两个循环可能会更快一些。
这是一个使用并行和异步处理的示例bash
:
#!/bin/bash
MAX_PARALLEL_PIDS=4 # adjust regarding your own machin capacity (cpu available, etc... it could be dynamically calculated)
declare -a POPS
declare -a PIDS
POPS=("LWK_GBR" "YRI_FIN")
# your heavy treatment in a function
process() {
pop="${1}"
filename="${2}"
firstpop="${pop%%_*}" # no need to call an external program here
secondpop="${pop#*_}" # same here
vcftools --gzvcf "${filename}" \
--weir-fst-pop "/outdir/${firstpop}file" \
--weir-fst-pop "/outdir/${secondpop}file" \
--out "/out/${pop}_${filename}"
}
# a function which is usefull to wait all process when your "thread pool" reached its limits
wait_for_pids() {
for pid in "${PIDS[@]}"; do
[[ $pid =~ ^[0-9]+ ]] && wait $pid
done
unset PIDS
}
i=0
for filename in *.vcf.gz; do
if [[ $i -ge $MAX_PARALLEL_PIDS ]]; then
i=0
wait_for_pids
fi
for population in "${POPS[@]}"; do
process "${population}" "${filename}" & # You won't wait for the end here
PIDS[$i]=$!
(( i++ ))
done
done
# at the end wait for the remaining processes
wait_for_pids
注意:抛开[[
条件中的变量,您应该注意引用可能包含一些空格的变量,例如文件名。否则它会破裂。