Python:在子进程中使用带有多个变量的awk.call

问题描述:

我正在处理一个包含多个记录的PDB文件。下面是一个例子文件,如果你不熟悉这种类型的格式:Python:在子进程中使用带有多个变量的awk.call

HEADER生长因子16-JAN-96 1KLA

SOURCE MOL_ID:1;

REMARK 210实验细节

REMARK 210实验类型:NMR

SSBOND 7 CYS乙15 CYS乙78 1555 1555 2.02

SSBOND 8 CYS乙44 CYS乙109 1555 1555 2.01

MODEL 1

ATOM 1 N ALA A 1 9.028 -1.949 -15.575 1.00 0.00 N

ATOM 2 CA ALA A 1 7.983 -2.064 -14.518 1.00 0.00 C4

TER

ATOM 1770ñALA乙1 -9.094 -0.752 15.747 1.00 0.00否

ATOM 1771 CA ALA乙1 -8.052 -0.952 14.700 1.00 0.00 C4

ENDMDL

CONECT 98 225

CONECT 215 1211

END

我想继续从该文件中只有某些记录:(SSBOND,ATOM,型号,TER,联系,ENDMDL)和删除等。为此,我做了一个python脚本,这需要pdb_file.pdb输入,并创建一个输出文件pdb_clean.pdb:

import subprocess 

def prep_molecule(pdb_file): 

    pdb_fileName = pdb_file.split(".")[0] 
    subprocess.call(['awk \'"\$1==\\"SSBOND\\" || \$1==\\"ATOM\\" || \$1==\\"TER\\" || \$1==\\"CONECT\\" || \$1==\\"END\\" || \$1==\\"MODEL\\" || \$1==\\"ENDMDL\\"\\' +pdb_file+' > '+pdb_fileName+'_clean.pdb"'],shell=True) 

也许问题来自引号。我一直有同样的错误:

awk: command line:1: ^syntax error 

其实我正在做一个Python脚本,因为awk不是我正在运行的唯一命令。我的目标是自动化完整的蛋白质动态管道,所以Python是必要的...

在此先感谢!

+2

我不明白这一点在使用'awk'内蟒蟒的时候可以做的更好,更简单.. –

+0

真实答案,请勿使用awk,请使用Python。任何你可以用awk做的事情,Python都可以做,所以你过于复杂了。但是,您正在构建一个命令字符串并将其传递给一步调用。相反,创建命令字符串并将其分配给变量。打印变量,然后传递变量来调用。您应该在打印语句中看到awk中的语法错误。 – RobertB

我的建议是只使用awk作为蟒蛇似乎对这个还算简单的任务有所uneccessary,然而,这里是用awk蟒蛇内的解决方案:

文件:

$ cat pbd_file.pbd 
HEADER GROWTH FACTOR 16-JAN-96 1KLA 

SOURCE MOL_ID: 1; 

REMARK 210 EXPERIMENTAL DETAILS 

REMARK 210 EXPERIMENT TYPE :NMR 

SSBOND 7 CYS B 15 CYS B 78 1555 1555 2.02 

SSBOND 8 CYS B 44 CYS B 109 1555 1555 2.01 

MODEL 1 

ATOM 1 N ALA A 1 9.028 -1.949 -15.575 1.00 0.00 N 

ATOM 2 CA ALA A 1 7.983 -2.064 -14.518 1.00 0.00 C 

TER 

ATOM 1770 N ALA B 1 -9.094 -0.752 15.747 1.00 0.00 N 

ATOM 1771 CA ALA B 1 -8.052 -0.952 14.700 1.00 0.00 C 

ENDMDL 

CONECT 98 225 

CONECT 215 1211 

END 

的Python脚本如下(使用sys.argv[1]意味着你可以通过任何你想要的文件作为命令行参数):

import subprocess, sys 

def prep_molecule(pdb_file): 
    pdb_fileName = pdb_file.split(".")[0] 
    subprocess.call(['awk \'$1~"SSBOND|ATOM|TER|CONECT|END|MODEL|ENDMDL"\' "'+pdb_file+'" > "'+pdb_fileName+'_clean.pdb"'],shell=True) 

if __name__ == '__main__': 
    prep_molecule(sys.argv[1]) 

那么,“干净”与python脚本文件:

$ python pdb_clean.py pdb_file.pdb 

结果:

$ cat pdb_file_clean.pdb 
SSBOND 7 CYS B 15 CYS B 78 1555 1555 2.02 
SSBOND 8 CYS B 44 CYS B 109 1555 1555 2.01 
MODEL 1 
ATOM 1 N ALA A 1 9.028 -1.949 -15.575 1.00 0.00 N 
ATOM 2 CA ALA A 1 7.983 -2.064 -14.518 1.00 0.00 C 
TER 
ATOM 1770 N ALA B 1 -9.094 -0.752 15.747 1.00 0.00 N 
ATOM 1771 CA ALA B 1 -8.052 -0.952 14.700 1.00 0.00 C 
ENDMDL 
CONECT 98 225 
CONECT 215 1211 
END 
+0

其实我正在做一个Python脚本,因为awk命令不是我正在运行的唯一一个。我的目标是自动化完整的蛋白质动态管道,因此Python是必要的... – Luc

+0

@Luc根据您的要求修改了答案,但是如果可能的话,您可能更好地创建一个shell脚本,或者如果没有的话,读取文件在python中并以这种方式进行管理 –