2015-02-11 80 views
0

我正在處理一些大的腳本,它們會生成一些新的input.sh文件,這些文件由一系列命令組成,這些命令按順序用作此處稱爲pmemd的某些程序的輸入。在printf中添加循環

這裏我想專注於如何獲得這個input.sh。用printf我有以下幾點:

printf "#setenv CUDA_VISIBLE_DEVICES "1"\nmpirun -np 8 pmemd.MPI -O -i ../in/minim.in -o minim.out -p ./protein.parm7 -c ./protein.inpcrd -r minim.restrt\npmemd.cuda -O -i ../in/equil.in -o equil.out -p ./protein.parm7 -c ./minim.restrt -r equil.restrt -x equil.nc -ref ./minim.restrt\npmemd.cuda -O -i ../in/equil2.in -o equil2.out -p ./protein.parm7 -c equil.restrt -r equil2.restrt -x equil2.nc -ref equil.restrt\npmemd.cuda -O -i ../in/equil3.in -o equil3.out -p ./protein.parm7 -c equil2.restrt -r equil3.restrt -x equil3.nc -ref equil2.restrt\npmemd.cuda -O -i ../in/equil4.in -o equil4.out -p ./protein.parm7 -c equil3.restrt -r equil4.restrt -x equil4.nc -ref equil3.restrt\npmemd.cuda -O -i ../in/equil5.in -o equil5_1.out -p ./protein.parm7 -c equil4.restrt -r equil5_1.restrt -x equil5.nc -ref equil4.restrt\npmemd.cuda -O -i ../in/equil5.in -o equil5_2.out -p ./protein.parm7 -c equil5_1.restrt -r equil5_2.restrt -x equil5.nc -ref equil5_1.restrt\npmemd.cuda -O -i ../in/equil5.in -o equil5_3.out -p ./protein.parm7 -c equil5_2.restrt -r equil5_3.restrt -x equil5.nc -ref equil5_2.restrt\npmemd.cuda -O -i ../in/equil5.in -o equil5_4.out -p ./protein.parm7 -c equil5_3.restrt -r equil5_4.restrt -x equil5.nc -ref equil5_3.restrt\npmemd.cuda -O -i ../in/equil5.in -o equil5_5.out -p ./protein.parm7 -c equil5_4.restrt -r equil5_5.restrt -x equil5.nc -ref equil5_4.restrt\npmemd.cuda -O -i ../in/md.in -o md_${P}_${com_n}.out -p ./protein.parm7 -c equil5_5.restrt -r md.restrt -x md.nc" > ./input.sh 

這導致input.sh最終組成的

#setenv CUDA_VISIBLE_DEVICES 1 
mpirun -np 8 pmemd.MPI -O -i ../in/minim.in -o minim.out -p ./protein.parm7 -c ./protein.inpcrd -r minim.restrt 
pmemd.cuda -O -i ../in/equil.in -o equil.out -p ./protein.parm7 -c ./minim.restrt -r equil.restrt -x equil.nc -ref ./minim.restrt 
pmemd.cuda -O -i ../in/equil2.in -o equil2.out -p ./protein.parm7 -c equil.restrt -r equil2.restrt -x equil2.nc -ref equil.restrt 
pmemd.cuda -O -i ../in/equil3.in -o equil3.out -p ./protein.parm7 -c equil2.restrt -r equil3.restrt -x equil3.nc -ref equil2.restrt 
pmemd.cuda -O -i ../in/equil4.in -o equil4.out -p ./protein.parm7 -c equil3.restrt -r equil4.restrt -x equil4.nc -ref equil3.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_1.out -p ./protein.parm7 -c equil4.restrt -r equil5_1.restrt -x equil5.nc -ref equil4.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_2.out -p ./protein.parm7 -c equil5_1.restrt -r equil5_2.restrt -x equil5.nc -ref equil5_1.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_3.out -p ./protein.parm7 -c equil5_2.restrt -r equil5_3.restrt -x equil5.nc -ref equil5_2.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_4.out -p ./protein.parm7 -c equil5_3.restrt -r equil5_4.restrt -x equil5.nc -ref equil5_3.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_5.out -p ./protein.parm7 -c equil5_4.restrt -r equil5_5.restrt -x equil5.nc -ref equil5_4.restrt 
pmemd.cuda -O -i ../in/md.in -o md_OR5P3_plus-carvone.out -p ./protein.parm7 -c equil5_5.restrt -r md.restrt -x md.nc 

,你可以看到這個方法是不是很舒服,因爲它是不容易編輯containt在初始腳本中的input.sh當我需要添加一些未來input.sh的修改時。另外當你注意到文件由片段組成,我需要獲取作爲一些循環的結果,因爲它包括幾個步驟像5_1,5_2等(這裏每個下一步使用前一個作爲輸入)

pmemd.cuda -O -i ../in/equil5.in -o equil5_1.out -p ./protein.parm7 -c equil4.restrt -r equil5_1.restrt -x equil5.nc -ref equil4.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_2.out -p ./protein.parm7 -c equil5_1.restrt -r equil5_2.restrt -x equil5.nc -ref equil5_1.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_3.out -p ./protein.parm7 -c equil5_2.restrt -r equil5_3.restrt -x equil5.nc -ref equil5_2.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_4.out -p ./protein.parm7 -c equil5_3.restrt -r equil5_4.restrt -x equil5.nc -ref equil5_3.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_5.out -p ./protein.parm7 -c equil5_4.restrt -r equil5_5.restrt -x equil5.nc -ref equil5_4.restrt 

所以我很感激,如果有人向我提供如何在這樣的printf操作符或其替代方法中添加For或While循環的想法。

感謝您的幫助!

格列布

+1

您是否嘗試過使用'for'循環(或兩個)?如果是這樣,你遇到了什麼問題?你知道如何使用字符串中的變量值嗎? – 2015-02-11 15:31:32

回答

2

這裏有一個shell腳本生成最在您的文章中的行:

prev=minim 
for i in '' $(seq 2 4); do 
    cur=equil$i 
    printf 'pmemd.cuda -O -i ../in/%s.in -o %s.out -p ./protein.parm7 -c %s.restrt -r %s.restrt -x %s.nc -ref %s.restrt\n' $cur $cur $prev $cur $cur $prev 
    prev=$cur 
done 
for i in $(seq 5); do 
    cur=equil5_$i 
    printf 'pmemd.cuda -O -i ../in/equil5.in -o %s.out -p ./protein.parm7 -c %s.restrt -r %s.restrt -x equil5.nc -ref %s.restrt\n' $cur $prev $cur $prev 
    prev=$cur 
done 

這產生:

pmemd.cuda -O -i ../in/equil.in -o equil.out -p ./protein.parm7 -c minim.restrt -r equil.restrt -x equil.nc -ref minim.restrt 
pmemd.cuda -O -i ../in/equil2.in -o equil2.out -p ./protein.parm7 -c equil.restrt -r equil2.restrt -x equil2.nc -ref equil.restrt 
pmemd.cuda -O -i ../in/equil3.in -o equil3.out -p ./protein.parm7 -c equil2.restrt -r equil3.restrt -x equil3.nc -ref equil2.restrt 
pmemd.cuda -O -i ../in/equil4.in -o equil4.out -p ./protein.parm7 -c equil3.restrt -r equil4.restrt -x equil4.nc -ref equil3.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_1.out -p ./protein.parm7 -c equil4.restrt -r equil5_1.restrt -x equil5.nc -ref equil4.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_2.out -p ./protein.parm7 -c equil5_1.restrt -r equil5_2.restrt -x equil5.nc -ref equil5_1.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_3.out -p ./protein.parm7 -c equil5_2.restrt -r equil5_3.restrt -x equil5.nc -ref equil5_2.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_4.out -p ./protein.parm7 -c equil5_3.restrt -r equil5_4.restrt -x equil5.nc -ref equil5_3.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_5.out -p ./protein.parm7 -c equil5_4.restrt -r equil5_5.restrt -x equil5.nc -ref equil5_4.restrt 
2

我可能會誤解你的問題,但似乎因爲你對這樣一個巨大的巨人printf行感到不舒服。那麼,爲什麼不把它分開呢。您可以使用>>附加到文件。這樣一來,在你input.sh每一行是一個單獨的printf行:

printf "#setenv CUDA_VISIBLE_DEVICES \"1\"\n" > input.sh 
printf "mpirun -np 8 pmemd.MPI -O -i ../in/minim.in -o minim.out -p ./protein.parm7 -c ./protein.inpcrd -r minim.restrt\n" >> input.sh 
printf "pmemd.cuda -O -i ../in/equil.in -o equil.out -p ./protein.parm7 -c ./minim.restrt -r equil.restrt -x equil.nc -ref ./minim.restrt\n" >> input.sh 
printf "pmemd.cuda -O -i ../in/equil2.in -o equil2.out -p ./protein.parm7 -c equil.restrt -r equil2.restrt -x equil2.nc -ref equil.restrt\n" >> input.sh 
printf "pmemd.cuda -O -i ../in/equil3.in -o equil3.out -p ./protein.parm7 -c equil2.restrt -r equil3.restrt -x equil3.nc -ref equil2.restrt\n" >> input.sh 
printf "pmemd.cuda -O -i ../in/equil4.in -o equil4.out -p ./protein.parm7 -c equil3.restrt -r equil4.restrt -x equil4.nc -ref equil3.restrt\n" >> input.sh 
printf "pmemd.cuda -O -i ../in/equil5.in -o equil5_1.out -p ./protein.parm7 -c equil4.restrt -r equil5_1.restrt -x equil5.nc -ref equil4.restrt\n" >> input.sh 
printf "pmemd.cuda -O -i ../in/equil5.in -o equil5_2.out -p ./protein.parm7 -c equil5_1.restrt -r equil5_2.restrt -x equil5.nc -ref equil5_1.restrt\n >> input.sh 
printf "pmemd.cuda -O -i ../in/equil5.in -o equil5_3.out -p ./protein.parm7 -c equil5_2.restrt -r equil5_3.restrt -x equil5.nc -ref equil5_2.restrt\n" >> input.sh 
printf "pmemd.cuda -O -i ../in/equil5.in -o equil5_4.out -p ./protein.parm7 -c equil5_3.restrt -r equil5_4.restrt -x equil5.nc -ref equil5_3.restrt\n" >> input.sh 
printf "pmemd.cuda -O -i ../in/equil5.in -o equil5_5.out -p ./protein.parm7 -c equil5_4.restrt -r equil5_5.restrt -x equil5.nc -ref equil5_4.restrt\n" >> input.sh 
printf "pmemd.cuda -O -i ../in/md.in -o md_${P}_${com_n}.out -p ./protein.parm7 -c equil5_5.restrt -r md.restrt -x md.nc\n" >> ./input.sh 

由於printf不會自動包括在年底NL,你甚至可以瓜分個人input.sh線更好的可讀性:

printf " pmemd.cuda -O"   >> input.sh 
printf " -i ../in/equil.in"  >> input.sh 
printf " -o equil.out"   >> input.sh 
printf " -p ./protein.parm7" >> input.sh 
printf " -c ./minim.restrt"  >> input.sh 
printf " -r equil.restrt"  >> input.sh 
printf " -x equil.nc"   >> input.sh 
printf " -ref ./minim.restrt" >> input.sh 
printf "\n"      >> input.sh 

現在,如果有所改變,您可以快速找到參數並對其進行修改。

您還可以結合起來,與使用for循環遞增你的價值觀Chris Jester-Young的建議:

for cur in '' $(seq 2 4) 
do 
    printf ' pmemd.cuda -O '    >> input.sh 
    printf ' -i ../in/equil%s.in ' $cur >> input.sh 
    printf ' -o equil%s.out'   $cur >> input.sh 
    printf ' -p ./protein.parm7"   >> input.sh 
    printf ' -c equil%s.restrt'  $prev >> input.sh 
    prinff ' -r equil%s.restrt'  $cur >> input.sh 
    printf ' -x equil%s.nc'   $cur >> input.sh 
    printf ' -ref equil%s.restrt\n' $prev >> input.sh 
    prev=$cur 
done 

注意每行的間隔如何使得它更容易閱讀和理解的命令。

最後,如果你不介意寫出整個文件,你可以使用這裏的文件。

<<開始這裏文件。 EOF是在文件結束時告知這裏的文件的參數。這可能是任何事情。例如,它可能是INPUT_SH。如果我把這個參數放在單引號中,shell不會內插變量。

cat <<'EOF' > input.sh 
#setenv CUDA_VISIBLE_DEVICES "1" 
mpirun -np 8 pmemd.MPI -O -i ../in/minim.in -o minim.out -p ./protein.parm7 -c ./protein.inpcrd -r minim.restrt 
pmemd.cuda -O -i ../in/equil.in -o equil.out -p ./protein.parm7 -c ./minim.restrt -r equil.restrt -x equil.nc -ref ./minim.restrt 
pmemd.cuda -O -i ../in/equil2.in -o equil2.out -p ./protein.parm7 -c equil.restrt -r equil2.restrt -x equil2.nc -ref equil.restrt 
pmemd.cuda -O -i ../in/equil3.in -o equil3.out -p ./protein.parm7 -c equil2.restrt -r equil3.restrt -x equil3.nc -ref equil2.restrt 
pmemd.cuda -O -i ../in/equil4.in -o equil4.out -p ./protein.parm7 -c equil3.restrt -r equil4.restrt -x equil4.nc -ref equil3.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_1.out -p ./protein.parm7 -c equil4.restrt -r equil5_1.restrt -x equil5.nc -ref equil4.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_2.out -p ./protein.parm7 -c equil5_1.restrt -r equil5_2.restrt -x equil5.nc -ref equil5_1.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_3.out -p ./protein.parm7 -c equil5_2.restrt -r equil5_3.restrt -x equil5.nc -ref equil5_2.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_4.out -p ./protein.parm7 -c equil5_3.restrt -r equil5_4.restrt -x equil5.nc -ref equil5_3.restrt 
pmemd.cuda -O -i ../in/equil5.in -o equil5_5.out -p ./protein.parm7 -c equil5_4.restrt -r equil5_5.restrt -x equil5.nc -ref equil5_4.restrt 
pmemd.cuda -O -i ../in/md.in -o md_${P}_${com_n}.out -p ./protein.parm7 -c equil5_5.restrt -r md.restrt -x md.nc 
EOF