Réarranger un tableau complexe en rassemblant les doubles ID...

Fermé
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 - 16 janv. 2014 à 20:16
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 17 janv. 2014 à 10:16
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
100, s800, 1.0, , 0.6
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
etc...

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
 
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
etc...

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. !!!

2 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
17 janv. 2014 à 08:54
hello
dans cat result, pour 301, d'où vient le -1.91 ?
...
301, 12, 16, 99, 87, -1.91, 44
...
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
17 janv. 2014 à 09:15
Salut,

À mon avis il s'est trompé de ligne :
311, 87, -1.91, 44
dans sa recopie ;-(

Si tu regardes la ligne 302 c'est pareil :
302, 15,17, 98
et
302, 16, 17, 99
donne :
302, 15,17, 98, 16, 16, 98
.
La seconde partie correspondant à la ligne
301, 16, 16, 98
;-(
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
17 janv. 2014 à 10:16
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
0