2013-07-08 2 views
-1

J'ai besoin d'aide. J'ai un fichier de données (sujet pilote) avec trois essais, chacun avec environ 1500 points de données. Chaque essai doit être tronqué à 1500 points de données. J'inclus le code que j'ai utilisé ainsi qu'un échantillon du fichier de données ci-dessous. Toute aide serait grandement appréciée.Troncature des essais

`BEGIN{ SKIP=0} 
{ 
if ($1=="MSG" && SKIP==0) 
{ 
    FS=" " 
    printf("\n%s",$6) 
    SKIP=1; 
} 
else if ($1=="MSG" && SKIP==1) 
{ 
    FS=" " 
    printf(" %d",$6) 
    SKIP=0; 
} 
else 

    FS="\t" 
    printf(" %.2f",($3+$4)/2) 

} 
} 


`MSG 1 # Message: bince.bmp     
MSG 1 # Message: 103    
SMP 1 0 0 0 0 0 
SMP 1 0 0 0 0 0 
SMP 1 0 0 0 0 0 
SMP 1 0 0 0 0 0 
SMP 1 0 0 0 0 0 
SMP 1 0 0 0 0 0 
SMP 1 0 0 0 0 0 
SMP 1 0 0 0 0 0 
SMP 1 10.44 10.44 11.26 11.26 0 
SMP 1 10.19 10.19 11.03 11.03 0 
SMP 1 10.09 10.09 11.23 11.23 0 
SMP 1 10.24 10.24 11.03 11.03 0 
SMP 1 10.09 10.09 11.3 11.3 0 
SMP 1 10.27 10.27 11.16 11.16 0 
SMP 1 10.02 10.02 11.22 11.22 0 
SMP 1 10.01 10.01 11.16 11.16 0 
SMP 1 10.28 10.28 11.16 11.16 0 
SMP 1 10.22 10.22 11.3 11.3 0 
SMP 1 10.18 10.18 11.25 11.25 0 
SMP 1 10.37 10.37 11.26 11.26 0 
SMP 1 10.54 10.54 11.22 11.22 0 
SMP 1 10.19 10.19 11.26 11.26 0 
SMP 1 10.39 10.39 11.27 11.27 0 

La sortie devrait finir par ressembler à cela, avec chaque essai étant une ligne avec un nombre désigné d'échantillons:

' 101 0.00 0.00 0.00...10.23 10.23 12.12 12.12 
    103 0.00 0.00 0.00...10.23 10.23 12.12 12.12 
    104 0.00 0.00 0.00...10.23 10.23 12.12 12.12' 

Ajouter quelque chose comme ceci juste tronque 1500 échantillons, et non dans chaque essai:

'BEGIN{ SKIP=0; counter=0} 
{ 
if ($1=="MSG" && SKIP==0) 
{ 
    FS=" " 
    printf("\n%s",$5) 
    SKIP=1; 
} 
else if ($1=="MSG" && SKIP==1) 
{ 
    FS=" " 
    printf(" %d",$6) 
    SKIP=0; 
} 
else if ($1!="MSG" && counter <=1500) { 
{ 
    FS="\t" 
    printf(" %.2f",($4+$5)/2) 
    counter++ 
} 
} 

} 
+0

Je vois 4 colonnes et je ne sais pas ce qu'est un point de données valide? – Endoro

+0

3 $ et 4 $ sont les diamètres des pupilles verticaux et horizontaux pour l'œil gauche. Ils sont moyennés pour créer un point de données. Les données ci-dessus sont seulement un échantillon. –

+0

Essentiellement, il produira un fichier avec le code du message et le diamètre moyen de la pupille pour chaque ligne d'une rangée. Les lignes ne sont pas de longueur égale, donc je dois les tronquer afin que les trois essais aient 1500 diamètres moyens. –

Répondre

1

Je suis jusqu'à présent pas sûr de vos besoins, mais cela est peut-être un point de départ:

$1=="MSG" { 
    if ($5 ~ /[0-9]+/){ 
     counter=0 
     } 
    printf("\n%s",$5) 
    } 
($1!="MSG") && ($3!=0) && (counter <= 10) { 
    printf("\n %.2f",($3+$4)/2) 
    counter++ 
    } 
+0

Je veux savoir comment je peux écrire une boucle for qui prend un sous-ensemble des tailles moyennes. Ainsi, par exemple, je veux seulement que la sortie inclue 20 points de données au lieu de 35. –

+0

Vous pouvez inclure un compteur, voir mon édition. – Endoro

+0

Ce qui précède est juste un petit échantillon des données réelles. Dans l'ensemble de données actuel, j'ai trois essais, chacun avec plus de 1500 observations. Pourrais-je inclure quelque chose comme: counter <= 1500 pour tronquer tous les essais? –