【问题标题】:Python : using awk with multiple variables in subprocess.callPython:在 subprocess.call 中使用带有多个变量的 awk
【发布时间】:2017-09-22 14:44:12
【问题描述】:

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

标题生长因子 16-JAN-96 1KLA

源 MOL_ID:1;

备注 210 实验细节

REMARK 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

原子 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 是必要的......

提前致谢!

【问题讨论】:

  • 当python可以做得更好更简单时,我看不到在python中使用awk的意义......
  • 真正的答案,不要使用awk,使用Python。任何你可以用 awk 做的事情,Python 都可以做,所以你把它复杂化了。但是,您正在构建一个命令字符串并将其传递给一步调用。相反,创建命令字符串并将其分配给变量。打印变量,然后将变量传递给调用。您应该在 print 语句中看到 awk 中的语法错误。

标签: python awk terminal subprocess pdb


【解决方案1】:

我的建议是只使用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 \'$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

【讨论】:

  • 实际上我正在制作一个 Python 脚本,因为 awk 命令不是我运行的唯一一个。我的目标是自动化完整的蛋白质动力学管道,因此 Python 是必要的......
  • @Luc 根据您的要求修改了答案,但如果可能,您最好创建一个 shell 脚本,或者如果没有,请在 python 中读取文件并以这种方式管理它
猜你喜欢
  • 2020-03-03
  • 2017-02-27
  • 1970-01-01
  • 2013-07-12
  • 2013-03-02
  • 2019-01-17
  • 2016-01-04
  • 2019-10-24
  • 1970-01-01
相关资源
最近更新 更多