Tenho um arquivo PDB (coordenadas de átomos em uma proteína) em uma máquina Linux:
ATOM 1 N GLY A 1 0.535 51.766 5.682 1.00 0.00
ATOM 2 CA GLY A 1 -0.712 50.962 5.596 1.00 0.00
ATOM 3 C GLY A 1 -1.243 50.872 4.179 1.00 0.00
ATOM 4 O GLY A 1 -1.313 51.888 3.492 1.00 0.00
ATOM 5 N GLN A 2 -1.600 49.664 3.737 1.00 0.00
ATOM 6 CA GLN A 2 -2.221 49.468 2.423 1.00 0.00
ATOM 7 C GLN A 2 -3.542 48.719 2.507 1.00 0.00
ATOM 8 O GLN A 2 -3.722 47.844 3.356 1.00 0.00
ATOM 9 CB GLN A 2 -1.280 48.738 1.468 1.00 0.00
ATOM 10 CG GLN A 2 -0.976 47.294 1.830 1.00 0.00
.... .. .. .. . . .... .... .... .... ....
TER SPLIT LINE FOR INTERNAL USE ONLY
ATOM 1 O5' G A 1 -44.412 97.503 31.177 1.00 0.00
ATOM 2 C5' G A 1 -45.447 96.803 31.882 1.00 0.00
ATOM 3 C4' G A 1 -45.225 95.295 31.894 1.00 0.00
ATOM 4 O4' G A 1 -46.441 94.578 31.654 1.00 0.00
ATOM 5 C3' G A 1 -44.328 94.850 30.748 1.00 0.00
ATOM 6 O3' G A 1 -42.943 94.877 31.129 1.00 0.00
ATOM 7 C2' G A 1 -44.804 93.425 30.542 1.00 0.00
ATOM 8 O2' G A 1 -44.163 92.592 31.466 1.00 0.00
ATOM 9 C1' G A 1 -46.304 93.444 30.772 1.00 0.00
ATOM 10 N9 G A 1 -46.965 93.699 29.495 1.00 0.00
.... .. .. . . . ....... ...... ..... .... ...
O registro TER marca explicitamente o fim de uma cadeia de aminoácidos específica. Quero alterar o ID da cadeia da proteína na quinta coluna pelo awk para atribuir o ID correto à nova cadeia após TER.
Resultado esperado:
ATOM 1 N GLY A 1 0.535 51.766 5.682 1.00 0.00
ATOM 2 CA GLY A 1 -0.712 50.962 5.596 1.00 0.00
ATOM 3 C GLY A 1 -1.243 50.872 4.179 1.00 0.00
ATOM 4 O GLY A 1 -1.313 51.888 3.492 1.00 0.00
ATOM 5 N GLN A 2 -1.600 49.664 3.737 1.00 0.00
ATOM 6 CA GLN A 2 -2.221 49.468 2.423 1.00 0.00
ATOM 7 C GLN A 2 -3.542 48.719 2.507 1.00 0.00
ATOM 8 O GLN A 2 -3.722 47.844 3.356 1.00 0.00
ATOM 9 CB GLN A 2 -1.280 48.738 1.468 1.00 0.00
ATOM 10 CG GLN A 2 -0.976 47.294 1.830 1.00 0.00
TER SPLIT LINE FOR INTERNAL USE ONLY
ATOM 1 O5' G B 1 -44.412 97.503 31.177 1.00 0.00
ATOM 2 C5' G B 1 -45.447 96.803 31.882 1.00 0.00
ATOM 3 C4' G B 1 -45.225 95.295 31.894 1.00 0.00
ATOM 4 O4' G B 1 -46.441 94.578 31.654 1.00 0.00
ATOM 5 C3' G B 1 -44.328 94.850 30.748 1.00 0.00
ATOM 6 O3' G B 1 -42.943 94.877 31.129 1.00 0.00
ATOM 7 C2' G B 1 -44.804 93.425 30.542 1.00 0.00
ATOM 8 O2' G B 1 -44.163 92.592 31.466 1.00 0.00
ATOM 9 C1' G B 1 -46.304 93.444 30.772 1.00 0.00
ATOM 10 N9 G B 1 -46.965 93.699 29.495 1.00 0.00
Tudo precisa ser separado com os mesmos espaços, o seguinte arranjo estaria errado:
ATOM 3674 CD1 PHE A 460 2.350 79.471 35.466 1.00 0.00
ATOM 3675 CD2 PHE A 460 1.037 81.443 35.196 1.00 0.00
ATOM 3676 CE1 PHE A 460 2.425 79.321 34.080 1.00 0.00
ATOM 3677 CE2 PHE A 460 1.108 81.298 33.805 1.00 0.00
ATOM 3678 CZ PHE A 460 1.805 80.232 33.250 1.00 0.00
TER SPLIT LINE FOR B USE ONLY
ATOM 1 O5' G B 1 -44.412 97.503 31.177 1.00 0.00
ATOM 2 C5' G B 1 -45.447 96.803 31.882 1.00 0.00
ATOM 3 C4' G B 1 -45.225 95.295 31.894 1.00 0.00
ATOM 4 O4' G B 1 -46.441 94.578 31.654 1.00 0.00
ATOM 5 C3' G B 1 -44.328 94.850 30.748 1.00 0.00
Além disso, o arquivo termina com isto:
TER
ENDMDL
Há uma linha em branco no final do arquivo que precisa ser deixada como está
Se seus campos forem delimitados por tabulações, isso pode ser o que você deseja, usando qualquer awk:
caso contrário, isso pode ser o que você quer, usando qualquer awk POSIX e não importa qual seja o espaço em branco entre os campos, contanto que você não possa ter espaço em branco nos primeiros 5 campos também:
Você pode tentar algo como:
Este código verifica se o primeiro token é = "TER" e define o sinalizador. Em seguida, verifica se o sinalizador é = 1 e, em caso afirmativo, define o valor do token 5 como "B". E, no final, imprime a linha inteira.
Você pode modificá-lo assim para torná-lo como uma tabela com
-R
alinhamento à direita de colunas específicasSe você quiser analisar e manipular corretamente arquivos PDB, deverá usar uma linguagem que tenha um módulo de biblioteca capaz de fazer isso.
Por exemplo, perl e o módulo Bio::PDB::Structure — um "módulo Perl para analisar e manipular arquivos do Protein Databank (PDB)"
Da descrição do módulo:
Resumindo, usar a ferramenta certa para o trabalho tornará o que você deseja fazer tão simples quanto:
$m = Bio::PDB::Structure::Molecule->new;
, para criar um novo objeto chamado$m
para armazenar os dados PDB, depois$m->read("molecule.pdb",0);
leia e analise o arquivo em$m
.$m
, verificaria se ele corresponde aos seus critérios e faria as alterações necessárias.$m->print("new.pdb");
Aliás, veja também Bioperl . Como diz a página da web: "O Projeto Bioperl é uma associação internacional de usuários e desenvolvedores de ferramentas Perl de código aberto para bioinformática, genômica e ciências da vida" .
Usar (e/ou modificar) código de código aberto existente pode economizar muitas horas, dias, semanas ou mais reinventando as mesmas ferramentas ou ferramentas semelhantes que muitos pesquisadores antes de você precisaram inventar.
Há também o Biopython , que é basicamente a mesma coisa para a linguagem Python em vez do Perl. Em particular, confira o pacote Bio.PDB .
E, de forma mais geral, temos a Open Bioinformatics Foundation : "A Open Bioinformatics Foundation (OBF) é um grupo sem fins lucrativos, administrado por voluntários, que promove o desenvolvimento de software de código aberto e a Ciência Aberta na comunidade de pesquisa biológica. A filiação à OBF é gratuita e aberta a qualquer pessoa que queira ajudar a promover o código aberto ou a ciência aberta em um campo biológico."