0

I'm working with some big script which produce some new input.sh file which consist of sequence of the commands step-by-step used as the input for some program called here pmemd.

Here I'd like to focus on how I obtain this input.sh. Using printf I have the following :

 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

which result in the input.sh eventually consisted of the

#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

as you can see this method is not very comfortable because it's not easy to edit containt of the input.sh within the initial script when I need to add some modification of future input.sh. Also As you notice the file consist of fragment which i need to obtain as the result of the some looping because it consist of several steps like 5_1, 5_2 etc (here each next step use the previous one as the input)

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

So I'd thankful if someone provide me with the ideas of how to add For or While loop within such printf operator or its alternatives.

Thanks for help!!

Gleb

1
  • 1
    Have you tried using a for loop (or two) yourself? If so, what problems did you encounter? Do you understand how to use the value of variables inside a string? Commented Feb 11, 2015 at 15:31

2 Answers 2

2

Here's a shell script that generates most of the lines in your post:

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

This generates:

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
Sign up to request clarification or add additional context in comments.

Comments

2

I might be misunderstanding your question, but it seems to be that you're not comfortable with such a big giant printf line. So, why not just divide it up. You can use >> to append to a file. This way, each line in your input.sh is a separate printf line:

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

Since printf doesn't automatically include a NL on the end, you could even divide up the individual input.sh lines for better readability:

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

Now, if something is changed, you can quickly find the parameter and modify it.

You could also combine that with Chris Jester-Young's suggestion of using a for loop to increment your values:

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

Note how the spacing on each line makes it easier to read and understand the command.

Finally, if you don't mind writing out the entire file, you can use a here document.

The << starts the here document. The EOF is the parameter that tells the here document when it ends. This could be anything. For example, it could be INPUT_SH. If I put that parameter in single quotes, the shell won't interpolate variables.

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.