AWK读取文件并在不同列之间操作

时间:2013-09-26 08:58:33

标签: 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 个答案:

答案 0 :(得分: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-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
}}

从每个文件中读取一行并将数据放入变量中 从这里可以看出

$ 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开始,更改为符合您的需要。我留给你的实际计算: - )