乘法

2013-09-26 45 views
0

我使用的是以下行乘法

awk '{if (FNR==90307) for(i=2;i<=10;i+=3) print " x=", x=$i," y=", y=$(i+1), "z=", z=$(i+2) }' coord.xvg veloc.xvg force.xvg 

此脚本输出从每个文件XVG的XYZ。

x= 5.78201 y= 6.72302 z= 7.07345 
x= 5.81603 y= 6.76299 z= 6.94258 
x= 5.70397 y= 6.75502 z= 6.85738 
x= -3.29165e-05 y= -3.86794e-05 z= 0.000126634 
x= -1.77439e-05 y= 3.28865e-05 z= -0.000156011 
x= -1.52779e-05 y= -9.56992e-05 z= 0.000427172 
x= 6.30622 y= 86.4321 z= 51.1683 
x= 55.7424 y= 26.0566 z= 76.0063 
x= -459.011 y= 19.386 z= 302.62 

的问题是,在相同的DO循环(当前帧),可以i执行以下乘法

i=2 
(x(2) from force.xvg) X (y(2) from coord.xvg) 

i=3 
(x(3) from force.xvg) X (y(3) from coord.xvg) 
i=4 

... .. ...。 ...。

回答

1

没有能够测试:这里

awk ' 
    FNR == 90307 { 
     for (n=2; n<=10; n+=3) { 
      i=(n+1)/3 
      x[i,FILENAME] = $n 
      y[i,FILENAME] = $(n+1) 
      z[i,FILENAME] = $(n+2) 
      print FILENAME, i, " x=", $n," y=", $(n+1), "z=", $(n+2) 
     } 
    } 
    END { 
     print "the products:" 
     for (i=1; i<=3; i++) { 
      print i, x[i,"force.xvg"] * y[i,"coord.xvg"] 
     } 
    } 
' coord.xvg veloc.xvg force.xvg 

要点:

  • FILENAME是一个awk变量保存当前输入文件名
  • AWK可以做伪多维阵列(这里的iFILENAMESUBSEP变量连接)
    • nawk和gawk实现这个,我不能说的其他awks。
+0

所有的现代awks都支持伪多维数组。只有破旧的awk(Solaris上的/ usr/bin/awk)不会,那是因为它很老,破损。 –

+0

非常好的答案!非常感激!! –

+0

如果我想为每条线做这件事,我应该怎么做?例如FNR == 90308,90309等 –