Réarranger un tableau complexe en rassemblant les doubles ID...
Swiss Knight
Messages postés
1956
Date d'inscription
Statut
Membre
Dernière intervention
-
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
Salut...
J'ai un problème en apparence simple mais je bûche. Je vais tenter de vous l'expliquer clairement.
J'ai des observations dans un tableau. Elles ont un ordre particulier parce qu'elles sont à chaque fois "à double". En fait, ça va comme ça, où "observation_x" représente un identificateur :
observation_1, val11, val12, val13, ...
observation_2, val21, val22, val23, ...
...
observation_n-1, valn-11, valn-12, valn-13, ...
observation_n, valn1, valn2, valn3, ...
observation_n, valrn1, valrn2, valrn3, ...
observation_n-1, valr-11, valr-12, valr-13, ...
...
observation_2, valr21, valr22, valr23, ...
observation_1, valr11, valr12, valr13, ...
Ceci représente un bloc.
Je ne l'ai pas notée, mais il est précédé par une ligne qui permet de savoir qui il est :
1000, blocl1, ..., val_bloc
L'identificateur de bloc, ici 1000, est dans la première colonne. La première colonne ne contient que les identificateurs de blocs et uniquement sur les lignes qui les décrivent.
La seconde colonne contient les identificateurs des observations de chaque bloc.
Les blocs se suivent et se ressemblent... à ça près que les identificateurs peuvent être différents d'un bloc à l'autre, mais certains s'y retrouvent. Et le nombre d'observations par bloc n'est normalement pas la même (ça peut, mais c'est pas obligé). Le nombre de colonnes du fichier, qui suivent les deux premières, peut varier, mais il reste petit (autour de 4 ou 5). J'ai une "cellule" vide dans la ligne identifiant les blocs (pas toujours, mais souvent... histoire de pas compliquer les choses)
Un exemple vaut plus que des mots :
cat plop
Venons en au but maintenant...
Je souhaite mettre en vis-à-vis les observations ayant le même identificateur au sein de chaque bloc, indépendamment les uns des autres :
cat result
Actuellement je "m'amuse" avec gnu-octave, mais ça implique quelques complications bien sympathiques, notamment au niveau du calcul des indices des matrices en fonction du nombre d'observation par bloc et du nombre de blocs... et mon code n'est pas très propre. D'où mon idée : épurer le fichier avant de faire des calculs sur ces valeurs (parce qu'il faut faire des calculs "par observation" et donc rassembler toutes celles d'un même ID).
M.E.R.C.I. !!!
J'ai un problème en apparence simple mais je bûche. Je vais tenter de vous l'expliquer clairement.
J'ai des observations dans un tableau. Elles ont un ordre particulier parce qu'elles sont à chaque fois "à double". En fait, ça va comme ça, où "observation_x" représente un identificateur :
observation_1, val11, val12, val13, ...
observation_2, val21, val22, val23, ...
...
observation_n-1, valn-11, valn-12, valn-13, ...
observation_n, valn1, valn2, valn3, ...
observation_n, valrn1, valrn2, valrn3, ...
observation_n-1, valr-11, valr-12, valr-13, ...
...
observation_2, valr21, valr22, valr23, ...
observation_1, valr11, valr12, valr13, ...
Ceci représente un bloc.
Je ne l'ai pas notée, mais il est précédé par une ligne qui permet de savoir qui il est :
1000, blocl1, ..., val_bloc
L'identificateur de bloc, ici 1000, est dans la première colonne. La première colonne ne contient que les identificateurs de blocs et uniquement sur les lignes qui les décrivent.
La seconde colonne contient les identificateurs des observations de chaque bloc.
Les blocs se suivent et se ressemblent... à ça près que les identificateurs peuvent être différents d'un bloc à l'autre, mais certains s'y retrouvent. Et le nombre d'observations par bloc n'est normalement pas la même (ça peut, mais c'est pas obligé). Le nombre de colonnes du fichier, qui suivent les deux premières, peut varier, mais il reste petit (autour de 4 ou 5). J'ai une "cellule" vide dans la ligne identifiant les blocs (pas toujours, mais souvent... histoire de pas compliquer les choses)
Un exemple vaut plus que des mots :
cat plop
100, s800, 1.0, , 0.6etc...
301, 12, 16, 99
302, 15,17, 98
305, 11, 2.2, -97
311, 88, -1.01, 55
4000, -0.02, 1.5, 99
50, 19, 19, 77
60, 11, 9, 8.9
60, 12, 10, 9.1
50, 21, 18, 78
4000, 0.001, 1.63, 99
311, 87, -1.91, 44
305, 11, 2.4, -99
302, 16, 17, 99
301, 16, 16, 98
1001, 1.0, , 0.52
201, 12, -1.6, 93
202, 11,-7.2, 94
205, 10, -2.2, 17
311, 89, -1.1, 15
500, -1.02, 15, 99
500, 0.1, 63, 99
311, 927, 7.91, 44
205, 121, 43, -99
202, 136, 31, 99
201, 146, 6, 98
Venons en au but maintenant...
Je souhaite mettre en vis-à-vis les observations ayant le même identificateur au sein de chaque bloc, indépendamment les uns des autres :
cat result
etc...
100, s800, 1.0, , 0.6
301, 12, 16, 99, 87, -1.91, 44
302, 15,17, 98, 16, 16, 98
305, 11, 2.2, -97, 16, 17, 99
311, 88, -1.01, 55, 11, 2.4, -99
4000, -0.02, 1.5, 99, 0.001, 1.63, 99
50, 19, 19, 77, 21, 18, 78
60, 11, 9, 8.9, 12, 10, 9.1
1001, 1.0, , 0.52
201, 12, -1.6, 93, 146, 6, 98
202, 11,-7.2, 94, 136, 31, 99
205, 10, -2.2, 17, 121, 43, -99
311, 89, -1.1, 15, 927, 7.91, 44
500, -1.02, 15, 99, 0.1, 63, 99
Actuellement je "m'amuse" avec gnu-octave, mais ça implique quelques complications bien sympathiques, notamment au niveau du calcul des indices des matrices en fonction du nombre d'observation par bloc et du nombre de blocs... et mon code n'est pas très propre. D'où mon idée : épurer le fichier avant de faire des calculs sur ces valeurs (parce qu'il faut faire des calculs "par observation" et donc rassembler toutes celles d'un même ID).
M.E.R.C.I. !!!
A voir également:
- Réarranger un tableau complexe en rassemblant les doubles ID...
- Tableau word - Guide
- Trier un tableau excel - Guide
- Tableau ascii - Guide
- Imprimer un tableau excel - Guide
- Tableau croisé dynamique - Guide
2 réponses
essayer
$ awk 'func f(t){for(a in t)print a t[a]} BEGIN {FS=OFS=","} /^[0-9]/ {if(n++)f(t); print; delete t; next} {x=$1; $1=""; t[x]=t[x] $0} END{f(t)}' plop
100, s800, 1.0, , 0.6
50, 19, 19, 77, 21, 18, 78
60, 11, 9, 8.9, 12, 10, 9.1
301, 12, 16, 99, 16, 16, 98
311, 88, -1.01, 55, 87, -1.91, 44
302, 15,17, 98, 16, 17, 99
305, 11, 2.2, -97, 11, 2.4, -99
4000, -0.02, 1.5, 99, 0.001, 1.63, 99
1001, 1.0, , 0.52
205, 10, -2.2, 17, 121, 43, -99
311, 89, -1.1, 15, 927, 7.91, 44
201, 12, -1.6, 93, 146, 6, 98
500, -1.02, 15, 99, 0.1, 63, 99
202, 11,-7.2, 94, 136, 31, 99
À mon avis il s'est trompé de ligne : dans sa recopie ;-(
Si tu regardes la ligne 302 c'est pareil :
et donne : .
La seconde partie correspondant à la ligne ;-(