Разбить файл по шаблонам в две последовательные строки - PullRequest
1 голос
/ 27 августа 2011

У меня есть файлы в следующем формате:

ATOM   3736  CB  THR A 486      -6.552 153.891  -7.922  1.00115.15           C  
ATOM   3737  OG1 THR A 486      -6.756 154.842  -6.866  1.00114.94           O  
ATOM   3738  CG2 THR A 486      -7.867 153.727  -8.636  1.00115.11           C  
ATOM   3739  OXT THR A 486      -4.978 151.257  -9.140  1.00115.13           O  
HETATM10351  C1  NAG A 203      33.671  87.279  39.456  0.50 90.22           C  
HETATM10483  C1  NAG A 702      28.025 104.269 -27.569  0.50 92.75           C    
ATOM   3736  CB  THR B 486      -6.552  86.240   7.922  1.00115.15           C  
ATOM   3737  OG1 THR B 486      -6.756  85.289   6.866  1.00114.94           O  
ATOM   3738  CG2 THR B 486      -7.867  86.404   8.636  1.00115.11           C  
ATOM   3739  OXT THR B 486      -4.978  88.874   9.140  1.00115.13           O  
HETATM10351  C1  NAG B 203      33.671 152.852 -39.456  0.50 90.22           C  
HETATM10639  C2  FUC B 402     -48.168 162.221 -22.404  0.50103.03           C 

Я хотел бы разбить файл после каждой строки, начинающейся с HETATM *, но только если следующая строка начинается с ATOM. Мне бы хотелось, чтобы новые файлы назывались $ basename_ $ column, где $ basename - это базовое имя входного файла, а $ column - символ в позиции 22-23 (в данном примере это A или B). Я не могу понять, как проверить обе последовательные строки, чтобы определить точку разделения.

Ответы [ 2 ]

3 голосов
/ 27 августа 2011

Вот awk версия

awk 'NR==1{n=$5}/HETATM/{f=1}f && /^ATOM/{n=$5;f=0}{print > "file"n".txt"}' file

Используйте FILENAME вместо file для создания того же имени файла.

1 голос
/ 27 августа 2011

Вот простое решение Python без проверки ошибок.Должен работать в Python 2 или 3;измените первую строку, чтобы соответствовать вашей среде.Не воспринимайте это как пример хорошего стиля кодирования.

Отредактировано для уникальных имен файлов.

#!/usr/bin/env python2.4

import os.path
import sys

fname = sys.argv[1]
bname = os.path.basename(fname)

fin = open(fname)

fout = None
ct = 0

for line in fin:
    if line[:6] == 'HETATM':
        flag = True
    if (not fout) or (flag and line[:4] == 'ATOM'):
        if fout:
            fout.close()
        ct += 1
        fout = open(bname + '_' + line[21:22] + str(ct), 'w')
        flag = False
    fout.write(line)

fout.close()
...