Hello,
je vais essayer d'être plus explicite, ce qui n'était pas le cas dans mon premier message. Mais pour répondre a Sve@r, je pense que c'est possible, et il me le confirmera après avoir vu la suite.
Voici donc un exemple de fichier que je veux transformer, qui contient des données sous une forme répétitive, je voudrais extraire les blocs de données (des coordonées) un par un, en les écrivant dans des fichiers qui sont incrémentés au fur et à mesure qu'ils sont lus.
Je souhaiterai que le titre général du fichier de départ soit repris en tête de chacun des fichiers (lignes 1 et 2), et que les sous-titres de section apparaissent également (lignes 3 et 4, puis après end\n end\n.
Voici un exemple:
!BIOSYM archive 3
PBC=OFF
input file for discover 435.6030
!DATE Thu Jan 13 11:46:39 2005
C01 -5.025863800 7.244002568 -2.013714777 MOL 1 cp C -0.100
C02 -5.621308166 8.441894104 -1.641637049 MOL 1 cp C -0.100
C03 -5.487535751 8.913697143 -0.340114590 MOL 1 cp C -0.100
C04 -4.760697134 8.183964782 0.613221110 MOL 1 cp C 0.179
C05 -4.141217551 6.973057864 0.227766329 MOL 1 cp C 0.179
C06 -4.285427926 6.516611169 -1.089195651 MOL 1 cp C -0.100
C07 -4.636362080 8.682850504 2.040567012 MOL 1 c' C 0.201
O072 -5.082137003 9.791345008 2.358442105 MOL 1 o' O -0.380
C08 -3.321835823 6.185377501 1.226036606 MOL 1 c' C 0.201
O081 -2.607491440 5.247603629 0.853231867 MOL 1 o' O -0.380
end
N -2.148307800 2.051270962 -20.085494995 LEUN D256 n4 N -0.500
CA -0.651043952 1.878017187 -20.083555222 LEUN D256 ca C 0.320
C -0.075287342 1.961853147 -18.664987564 LEUN D256 c' C 0.380
O -0.324314356 2.940160036 -17.949766159 LEUN D256 o' O -0.380
CB 0.025487572 2.959214211 -20.950561523 LEUN D256 c2 C -0.200
CG -0.277858555 3.069788218 -22.458589554 LEUN D256 c1 C -0.100
end
end
input file for discover 437.1630
!DATE Thu Jan 13 11:46:39 2005
C01 -4.351889556 7.079741676 -1.520970600 MOL 1 cp C -0.100
C02 -4.734089789 8.349428503 -1.110912678 MOL 1 cp C -0.100
C03 -4.514119725 8.754778304 0.200306444 MOL 1 cp C -0.100
C04 -3.916004573 7.886262812 1.125546338 MOL 1 cp C 0.179
C05 -3.518875921 6.595545174 0.703879342 MOL 1 cp C 0.179
C06 -3.738831683 6.210077354 -0.625717724 MOL 1 cp C -0.100
C07 -3.688085573 8.326146777 2.559519522 MOL 1 c' C 0.201
O072 -3.913608344 9.492763122 2.902060659 MOL 1 o' O -0.380
C08 -2.851271760 5.651878215 1.680951736 MOL 1 c' C 0.201
Explication: des blocs de coordonnées séparés par des doubles "end", avec deux sections dans chaque bloc séparées par un seul "end". Les doubles "end" sont suivis de deux lignes de titres pour le bloc. La longueur des sous sections permettrait sans doute de les différencier. Le nb de lignes de données dans l'exemple est très inférieur à la réalité...
VOici maintenant ce que j'ai écrit, très simple, pour extraire le premier bloc, et sur lequel je voudrais maintenant installer une boucle conditionnelle permettant de passer le "end" de sous-section, puis le double "end" de section...mais là j'ai échoué pour le moment.
BEGIN {
f=1
fichier="fichier"
fichier=fichier f
print "!BIOSYM archive 3" >fichier
print "PBC=OFF" >fichier
}
$1=="end" || $0=="" {exit}
NF>3 && NF<=9 {print $0 > fichier}
END {print "fini"}
f sera ma variable d'incrémentation pour les nom de fichiers successifs. Je m'appuie sur le nb de champs pour la lecture des lignes, la ligne vide signifiant la fin du fichier d'origine.
Actuellement un while à la suite de BEGIN ne me permet pas de faire tourner plus avant.
Si qqun peut aider, j'accueillerai toute suggestion (je débute), sinon je posterai les updates en fonction de ma progression.
Merci par avance.
Jet
Poste le Friday 13 May 2005 13:16:23