0

我有一个目录中的 PDB(文本)文件。我想打印每个 PDB 文件中的子单元数。

  1. 读取 pdb 文件中以ATOM
  2. ATOM行的第五列包含ABCD
  3. 如果只包含A子单元数为 1。如果包含A和子B单元数为 2。如果包含A,BC单元数为 3。

1kg2.pdb 文件

ATOM   1363  N   ASN A 258      82.149 -23.468   9.733  1.00 57.80           N  
ATOM   1364  CA  ASN A 258      82.494 -22.084   9.356  1.00 62.98           C  
ATOM   1395  C   MET B 196      34.816 -51.911  11.750  1.00 49.79           C  
ATOM   1396  O   MET B 196      35.611 -52.439  10.963  1.00 47.65           O  

1uz3.pdb 文件

ATOM   1384  O   ARG A 260      80.505 -20.450  15.420  1.00 22.10           O 
ATOM   1385  CB  ARG A 260      78.980 -18.077  15.207  1.00 36.88           C 
ATOM   1399  SD  MET B 196      34.003 -52.544  16.664  1.00 57.16           S 
ATOM   1401  N   ASP C 197      34.781 -50.611  12.007  1.00 44.30           N  

2b69.pdb 文件

ATOM   1393  N   MET B 196      33.300 -54.017  12.033  1.00 46.46           N  
ATOM   1394  CA  MET B 196      33.782 -52.714  12.566  1.00 49.99           C  

期望的输出

pdb_id   subunits

 1kg2      2
 1uz3      3
 2b69      1

如何使用 awk、python 或 Biopython 做到这一点?

4

2 回答 2

2

您可以使用数组记录第五列的所有可见值。

$ gawk '/^ATOM/ {seen[$5] = 1} END {print length(seen)}' 1kg2.pdb
2

编辑:使用 gawk 4.x,您可以使用它ENDFILE来生成所需的输出:

BEGIN {
  print "pdb_id\t\tsubunits"
  print
}

/^ATOM/ {
  seen[$5] = 1
}

ENDFILE {
  print FILENAME, "\t", length(seen)
  delete seen
}

结果:

$ gawk -f pdb.awk 1kg2.pdb 1uz3.pdb 2b69.pdb
pdb_id          subunits

1kg2.pdb         2
1uz3.pdb         3
2b69.pdb         1
于 2012-09-15T15:04:40.750 回答
0

字典是计算唯一出现次数的一种方法。以下为每个子单元分配一个无意义的值 (0),因为您只关心唯一子单元(字典键)的数量。

import os

for fn in os.listdir():
    if ".pdb" in fn:
        sub = {}
        with open(fn, 'r') as f:
            for line in f:
                c = line.split()
                if len(c) > 5 and c[0] == "ATOM":
                    sub[c[4]] = 0
        print(fn, len(sub.keys()))

(一个全新的用户应该得到一个答案以及指向http://whathaveyoutried.com/的指针。随后的问题应该包括用户实际尝试解决问题的证据。)

于 2012-09-15T15:42:18.770 回答