Python : 在 subprocess.call 中对多个变量使用 awk
Python : using awk with multiple variables in subprocess.call
我正在处理一个包含多条记录的 PDB 文件。如果您不熟悉这种格式,这里有一个示例文件:
HEADER 生长因子 16-JAN-96 1KLA
来源MOL_ID:1;
备注 210 实验细节
备注 210 实验类型: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
模型 1
原子 1 N ALA A 1 9.028 -1.949 -15.575 1.00 0.00 N
原子 2 CA ALA A 1 7.983 -2.064 -14.518 1.00 0.00 C
TER
原子 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
连接 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 的解决方案:
文件:
$ 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 \'~"SSBOND|ATOM|TER|CONECT|END|MODEL|ENDMDL"\' "'+pdb_file+'" > "'+pdb_fileName+'_clean.pdb"'],shell=True)
if __name__ == '__main__':
prep_molecule(sys.argv[1])
然后,"clean" 带有 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
我正在处理一个包含多条记录的 PDB 文件。如果您不熟悉这种格式,这里有一个示例文件:
HEADER 生长因子 16-JAN-96 1KLA
来源MOL_ID:1;
备注 210 实验细节
备注 210 实验类型: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
模型 1
原子 1 N ALA A 1 9.028 -1.949 -15.575 1.00 0.00 N
原子 2 CA ALA A 1 7.983 -2.064 -14.518 1.00 0.00 C
TER
原子 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
连接 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 的解决方案:
文件:
$ 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 \'~"SSBOND|ATOM|TER|CONECT|END|MODEL|ENDMDL"\' "'+pdb_file+'" > "'+pdb_fileName+'_clean.pdb"'],shell=True)
if __name__ == '__main__':
prep_molecule(sys.argv[1])
然后,"clean" 带有 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