J'ai une série de fichiers 0000.vx.dat, 0000.vy.dat, 0000.vz.dat ; ... ; 0077.vx.dat, 0077.vy.dat, 0077.vz.dat... Chaque fichier est une matrice 2D séparée par un espace. J'aimerais prendre chaque triplet de fichiers et les combiner dans un format de données basé sur les coordonnées, c'est-à-dire.. :
[timestep + 1] [i] [j] [vx(i,j)] [vy(i,j)] [vz(i,j)]
Chaque numéro de fichier correspond à un pas de temps particulier. Etant donné la quantité de données que j'ai dans cette série temporelle (~ 4 GB), bash ne suffisait pas et il semblait donc temps de passer à awk... plus précisément à mawk. C'était assez stupide d'essayer cela en bash mais voici ma tentative malheureuse :
for x in $(seq 1 78)
do
tfx=${tf[$x]} # an array of padded zeros
for y in $(seq 1 1568)
do
for z in $(seq 1 1344)
do
echo $x $y $z $(awk -v i=$z -v j=$y "FNR == i {print j}" $tfx.vx.dat) $(awk -v i=$z -v j=$y "FNR == i {print j}" $tfx.vy.dat) $(awk -v i=$z -v j=$y "FNR == i {print j}" $tfx.vz.dat) >> $file
done
done
done
edit : Merci, ruakh, de m'avoir fait remarquer que j avait gardé le format de variable shell avec un $ devant ! Ce n'est qu'un extrait du script original, mais je suppose qu'on peut considérer qu'il s'agit de l'essentiel !
Il suffit de dire que cela aurait pris environ six mois à cause de toute la surcharge de mémoire dans bash associée aux algorithmes O(MxN), aux sous-shells, aux tuyaux et à tout ce qui s'ensuit. J'espérais plutôt une journée au maximum. Chaque fichier fait environ 18 Mo, ce qui ne devrait pas poser trop de problèmes. Je serais satisfait de faire cela un pas de temps à la fois en awk à condition que j'obtienne un fichier de sortie par pas de temps. Je pourrais simplement les regrouper sans trop de problèmes par la suite, je pense. Il est important, cependant, que le numéro du pas de temps soit le premier élément de la liste des coordonnées. Je pourrais y parvenir avec un argument awk -v (voir ci-dessus) dans une routine bash. Je ne sais pas comment rechercher des éléments spécifiques de matrices dans trois fichiers distincts et les rassembler en une seule sortie. C'est le principal obstacle que j'aimerais surmonter. J'espérais que mawk pourrait fournir un bon équilibre entre l'effort et la vitesse de calcul. Si cela semble trop pour un script awk script, je pourrais passer à quelque chose de plus bas niveau, et j'apprécierais que ceux qui me répondent me fassent savoir que je devrais plutôt passer au C.
Merci d'avance ! J'aime beaucoup awk, mais j'ai peur d'être un novice.
Les trois fichiers, 0000.vx.dat, 0000.vy.dat et 0000.vz.dat se lisent comme suit (sauf qu'ils sont énormes et de dimensions correctes) :
0000.vx.dat :
1 2 3
4 5 6
7 8 9
0000.vy.dat :
10 11 12
13 14 15
16 17 18
0000.vz.dat :
19 20 21
22 23 24
25 26 27
J'aimerais être en mesure d'effectuer des saisies :
awk -v t=1 -f stackoverflow.awk 0000.vx.dat 0000.vy.dat 0000.vz.dat
et j'obtiens le résultat suivant :
1 1 1 1 10 19
1 1 2 2 11 20
1 1 3 3 12 21
1 2 1 4 13 22
1 2 2 5 14 23
1 2 3 6 15 24
1 3 1 7 16 25
1 3 2 8 17 26
1 3 3 9 18 27
edit : Merci, shellter, de m'avoir suggéré d'indiquer plus clairement l'entrée et la sortie souhaitées !