Difference between revisions of "Split NMR-style multiple model pdb files into individual models"

From CCP4 wiki
Jump to navigationJump to search
Line 24: Line 24:
  
 
'''done < /path/to/file.pdb'''
 
'''done < /path/to/file.pdb'''
 +
 +
 +
== Awk script ==
 +
 +
Should be called as
 +
 +
awk -f script.awk < models.pdb
 +
 +
'''BEGIN {file = 0; filename = "model_"  file ".pdb"}'''
 +
 +
'''/ENDMDL/ {getline; file ++; filename = "model_" file ".pdb"}'''
 +
 +
'''{print $0 > filename}'''
  
  

Revision as of 14:46, 15 December 2010

This assumes that you have a correctly formatted pdb file that contains both MODEL and ENDMDL records.


Bash/awk one-liner

This one-liner splits the file models.pdb into individual pdb files named model_###.pdb.

grep -n 'MODEL\|ENDMDL' models.pdb | cut -d: -f 1 | awk '{if(NR%2) printf "sed -n %d,",$1+1; else printf "%dp > model_%03d.pdb\n", $1-1,NR/2;}' | bash -sf

Bash script

i=1

while read -a line; do

echo "${line[@]}" >> model_${i}.pdb

[[ ${line[0]} == ENDMDL ]] && ((i++))

done < /path/to/file.pdb


Awk script

Should be called as

awk -f script.awk < models.pdb

BEGIN {file = 0; filename = "model_" file ".pdb"}

/ENDMDL/ {getline; file ++; filename = "model_" file ".pdb"}

{print $0 > filename}


Perl script

$base='1g9e';open(IN,"<$base.pdb");@indata = <IN>;$i=0;

foreach $line(@indata) {

if($line =~ /^MODEL/) {++$i;$file="${base}_$i.pdb";open(OUT,">$file");next}

if($line =~ /^ENDMDL/) {next}

if($line =~ /^ATOM/ || $line =~ /^HETATM/) {print OUT "$line"}

}


Back to Useful scripts (aka smart piece of code)