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

Python:在subprocess.call中使用带有多个变量的awk,python,awk,terminal,subprocess,pdb,Python,Awk,Terminal,Subprocess,Pdb,我正在处理一个包含多条记录的PDB文件。如果您不熟悉这种格式,下面是一个示例文件: 收割台生长因子16-JAN-96 1KLA 源代码:1 备注210实验细节 备注210实验类型:核磁共振 SSBOND 7 CYS B 15 CYS B 78 1555 1555 2.02 SSBOND 8 CYS B 44 CYS B 109 1555 1555 2.01 模式1 原子1N ALA A 19.028-1.949-15.5751.00 0.00 N 原子2 CA-ALA A 17.983-2.06

我正在处理一个包含多条记录的PDB文件。如果您不熟悉这种格式,下面是一个示例文件:

收割台生长因子16-JAN-96 1KLA

源代码:1

备注210实验细节

备注210实验类型:核磁共振

SSBOND 7 CYS B 15 CYS B 78 1555 1555 2.02

SSBOND 8 CYS B 44 CYS B 109 1555 1555 2.01

模式1

原子1N ALA A 19.028-1.949-15.5751.00 0.00 N

原子2 CA-ALA A 17.983-2.064-14.518 1.00 0.00 C

原子1770 N ALA B 1-9.094-0.752 15.747 1.00 0.00 N

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

ENDMDL

合同98 225

合同215 1211

结束

我只想保留这个文件中的某些记录:(SSBOND、ATOM、MODEL、TER、CONECT、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是必要的


提前谢谢

我的建议是只使用
awk
,因为对于这个相当简单的任务,python似乎有些不必要,但是,这里有一个在python中使用awk的解决方案:

文件:

Python脚本如下所示(使用
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

我看不出在python内部使用
awk
的意义,因为python可以做得更好、更简单……真正的答案是,不要使用awk,使用python。任何你能用awk做的事情,Python都能做,所以你把它复杂化了。但是,您正在构建一个命令字符串,并在一个步骤中将其传递给调用。相反,创建命令字符串并将其分配给变量。打印变量,然后将变量传递给调用。您应该在print语句中看到awk中的语法错误。实际上,我正在编写一个Python脚本,因为awk命令不是我运行的唯一命令。我的目标是自动化一个完整的蛋白质动力学管道,因此Python是必要的…@Luc根据您的需求修改了答案,但是如果可能的话,您最好创建一个shell脚本,或者如果没有,用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