Bonsoir, mon problème est le suivant,
j'ai un fichier "pdb" (par exemple ici 1J1H), dans lequel je dois remplacer l'avant dernier nombre
par une valeur identique pour chaque groupe d'atome. ex du fichier pdb :
c'est-à-dire ici ce qui précède la lettre de fin par le code se trouvant en dernière position du second fichier, et ce pour chaque groupe d'atome/
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 ATOM 943 N ILE A 60 17.874 -3.630 -2.201 1.00 0.33 N ATOM 944 CA ILE A 60 16.488 -3.129 -2.150 1.00 0.37 C ATOM 945 C ILE A 60 16.156 -2.460 -3.476 1.00 0.48 C ATOM 946 O ILE A 60 16.849 -1.587 -3.922 1.00 0.41 O ATOM 947 CB ILE A 60 16.352 -2.155 -0.949 1.00 0.47 C ATOM 948 CG1 ILE A 60 16.726 -2.924 0.343 1.00 0.70 C ATOM 949 CG2 ILE A 60 14.896 -1.692 -0.855 1.00 0.48 C ATOM 950 CD1 ILE A 60 18.209 -3.320 0.323 1.00 1.71 C ATOM 951 H ILE A 60 18.621 -3.002 -2.122 1.00 0.46 H ATOM 952 HA ILE A 60 15.820 -3.967 -2.003 1.00 0.38 H ATOM 953 HB ILE A 60 17.009 -1.273 -1.062 1.00 0.66 H ATOM 954 HG12 ILE A 60 16.533 -2.310 1.207 1.00 0.67 H ATOM 955 HG13 ILE A 60 16.129 -3.820 0.411 1.00 1.25 H ATOM 956 HG21 ILE A 60 14.860 -0.613 -0.863 1.00 0.76 H ATOM 957 HG22 ILE A 60 14.341 -2.077 -1.698 1.00 0.76 H ATOM 958 HG23 ILE A 60 14.460 -2.061 0.061 1.00 0.93 H ATOM 959 HD11 ILE A 60 18.647 -3.136 1.289 1.00 2.07 H ATOM 960 HD12 ILE A 60 18.295 -4.369 0.085 1.00 2.28 H ATOM 961 HD13 ILE A 60 18.730 -2.742 -0.422 1.00 1.89 H
Cependant, on code fonctionne pour environs 97% des lignes, mais pour les 3% restant déconne plus que trop
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Y A59 C 63 0.00 I A60 E 3 0.00 A A61 E 38 -5.63
il m'inverse l'avant dernière valeur et la précédente, ou me remplace le nombre en seconde position par le nombre que je suis placer en avant dernier.
mon expression régulière est la suivante (dans une boucle qui détecte à quel groupe d'atome on se trouve via une expression régulière également)
je ne comprend pas ce qui cloche dans mes expressions...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 if ($LINES[$j]=~/(^ATOM)\s+(\d+)\s+(\w+)\s+(\w{3})\s(\w)\s+(\d+)/) { $v=$6; if ($i == $v) { if ($LINES[$j]=~/(-?\d+\.\d+)\s+(\w)\s\s$/){ $LINES[$j]=~s/$1/$val[$i+1]/; } } }
une solution plus simple et moins propre serait de découper la chaine selon les espaces et de remplacer l'avant dernier, ca fonctionnerais, mais moins propre.
Pourriez-vous m'aider svp... ?
Merci ^^
PS : aussi si qqun connais une facons de bien aligner toutes les "colonnes", je suis preneur
Partager