2013-09-26 24 views
0

我有三个文件!AWK读取文件并在不同列之间进行操作

coord.xvg 
veloc.xvg 
force.xvg 
每个文件

有多个号码线可以说10000 我想建立一个脚本,

打开三个文件 读取列 ,使他们之间的算术运算的每一行。

例如

if every file has 4 words 

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

和C,V,F代表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 

我已经在互联网上找到以下

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 

它代表我想要在90307行之后开始读取的文件。

,但它并没有帮助我很多,因为它仅返回的每一个变量

任何思想的最后的值?

回答

1

的东西,让你开始,如果我正确

$ 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 

以下AWK-脚本

{ 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 
}} 

读取每个文件的线路并使数据变量 如能理解你在这里可以看到

$ 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 

if (FNR>=1)部分控制显示哪条线。计数从1开始,将其更改为符合您的需要。我给你的实际计算:-)

+0

谢谢你的回复!这是非常接近的,但我认为我没有解释到底我想要什么。 我的文件coord.xvg veloc.xvg force.xvg包含90307列和差不多60gb !!!!!!所以我需要在上面的脚本中使用“for”语句。这就是为什么我以我为例。 –

+0

我做了以下,但我仍然错过了一些东西,因为对于fz * z的多样性,这个脚本将fz的当前值和coord.xvg的最后一个值相乘!!!!! (i = 2; i <= 10; i + = 3)print“x =”,x = $ i,“if(FNR == 90307) y =“,y = $(i + 1),”z =“,z = $(i + 2),”z * x =“,z * x getline <”veloc.xvg“; if(FNR =打印“vx =”,vx = $ i,“vy =”,vy = $(i + 1),“vz =”,vz = 90307) $(i + 2) getline <“force.xvg”; if(FNR == 90307)for(i = 2; i <= 10; i + = 3)print“fx =”,fx = $ i,“fy =“,fy = $(i + 1),”fz =“,fz = $(i + 2),”fz * z =“,fz * z } END {print”z =“,z}' coord.xvg –