2013-09-26 4 views
0

J'ai trois fichiers!AWK lire un fichier et opérer entre différentes colonnes

coord.xvg 
veloc.xvg 
force.xvg 

ont chacun de ces fichiers lignes avec plusieurs numéros permet de dire 10000 je voudrais construire un script qui

ouvre les trois fichiers lectures colonnes et effectuer des calculs arithmétiques entre eux pour chaque ligne.

Par exemple

if every file has 4 words 

coord.xvg >> Time x y z 
veloc.xvg >> Time vx vy vz 
force.xvg >> Time fx fy fz 

et c, v, f est synonyme de coord.xvg, veloc.xvg, force.xvg

if I write the operation 2*v*v+c*f*c the output should be 
column1 Column2   Column3   Column4 
Time  2*vx*vx+cx*fx*cx 2*vy*vy+cy*fy*cy 2*vz*vz+cz*fz*cz 

J'ai trouvé dans Internet les éléments suivants

awk '{ 
     { getline < "coord.xvg" ; if (FNR==90307) for(i=1;i<=2;i+=1) c=$i} 
     { getline < "veloc.xvg" ; if (FNR==90307) for(i=1;i<=2;i+=1) v=$i} 
     { getline < "force.xvg" ; if (FNR==90307) for(i=1;i<=2;i+=1) f=$i} 
    } 
END {print c+v+f}' coord.xvg 

qui correspond à mes fichiers que je veux commencer à lire après 90307 lignes.

mais il ne m'a pas aidé autant qu'elle ne renvoie que les dernières valeurs de toutes les variables

Toute pensée ??

Répondre

1

Quelque chose pour vous lancer si je vous ai bien compris

$ cat *.xvg 
Time 1 2 3 
Time 4 5 6 
Time 7 8 9 
Time 10 11 12 
Time 13 14 15 
Time 16 17 18 
Time 19 20 21 
Time 22 23 24 
Time 25 26 27 

Ce qui suit awk script

{ if (FNR>=1) { 
    { getline < "coord.xvg" ; c1=$2;c2=$3;c3=$4} 
    { getline < "veloc.xvg" ; v1=$2;v2=$3;v3=$4} 
    { getline < "force.xvg" ; f1=$2;f2=$3;f3=$4} 
    print c1,c2,c3,v1,v2,v3,f1,f2,f3 
    print $1, c1+v1+f1, c2+v2+f2, c3+v3+f3 
}} 

lit une ligne de chacun des fichiers et met les données dans les variables comme peut être vu ici

$ awk -f s.awk coord.xvg 
1 2 3 19 20 21 10 11 12 
Time 30 33 36 
4 5 6 22 23 24 13 14 15 
Time 39 42 45 
7 8 9 25 26 27 16 17 18 
Time 48 51 54 

Le if (FNR>=1) partie contrôle quelles lignes sont affichées. Le comptage commence à 1, changez cela pour correspondre à votre besoin. Les calculs réels que je vous laisse :-)

+0

Merci pour votre réponse !! C'est très proche mais je pense que je n'ai pas expliqué exactement ce que je veux. Mes fichiers coord.xvg veloc.xvg force.xvg contiennent 90307 colonnes et presque 60gb !!!!!! J'ai donc besoin d'une instruction "for" dans le script ci-dessus. C'est pourquoi je l'ai dans mon exemple. –

+0

J'ai fait ce qui suit mais il me manque encore quelque chose car pour la multiplicité de fz * z ce script multiplie la valeur courante de fz et la dernière valeur de coord.xvg !!!!! Awk '{ getline <"coord.xvg"; if (FNR == 90307) pour (i = 2; i <= 10; i + = 3) afficher "x =", x = $ i, " y = ", y = $ (i + 1)," z = ", z = $ (i + 2)," z * x = ", z * x getline <" veloc.xvg "; if (FNR = = 90307) pour (i = 2; i <= 10; i + = 3) imprimer "vx =", vx = $ i, "vy =", vy = $ (i + 1), "vz =", vz = $ (i + 2) getline <"force.xvg"; if (FNR == 90307) pour (i = 2; i <= 10; i + = 3) imprime "fx =", fx = $ i, "fy = ", fy = $ (i + 1)," fz = ", fz = $ (i + 2)," fz * z = ", fz * z } FIN {print" z = ", z} ' coord.xvg –

Questions connexes