使用awk查找字段的平均值?

使用awk查找字段的平均值?,awk,Awk,这就是我想做的: 查找HETATM记录的x、y、z的平均值,x值为7字段,y值为8字段,z值为9字段 我正在尝试使用此文件执行此操作 这是样品 HETATM 1756 O HOH A 501 -0.923 10.560 127.393 1.00 16.58 O HETATM 1757 O HOH A 502 9.272 22.148 134.167 1.00 15.08 O HETATM 1758

这就是我想做的:

查找HETATM记录的x、y、z的平均值,x值为7字段,y值为8字段,z值为9字段

我正在尝试使用此文件执行此操作

这是样品

  HETATM 1756  O   HOH A 501      -0.923  10.560 127.393  1.00 16.58           O  
 HETATM 1757  O   HOH A 502       9.272  22.148 134.167  1.00 15.08           O  
 HETATM 1758  O   HOH A 503       0.109  20.243 112.094  1.00 20.74           O  
 HETATM 1759  O   HOH A 504      -3.930  10.522 125.779  1.00 20.79           O  
 HETATM 1760  O   HOH A 505      -0.759  36.323  88.018  1.00 17.42           O  
 HETATM 1761  O   HOH A 506      -4.645  51.936  81.852  1.00 21.43           O  
 HETATM 1762  O   HOH A 507      -3.900  17.103 128.596  1.00 14.08           O  
 HETATM 1763  O   HOH A 508       6.834  21.053 135.062  1.00 16.98           O  
有人能告诉我怎么做这个脚本吗

(此部分与观众可以忽略的评论相关)

这不是火箭科学。(更新为仅捕获HETATM记录-这是一个微不足道的更改;如果需要,您可以使用更严格的正则表达式。但是,还需要计算哪些记录匹配并使用该计数,而不是
NR
,因为您通常会忽略许多记录。)

是的,你可以把它全部放在一行上,但它不那么可读

我无法回答为什么它会为你产生零;当根据问题中的数据运行时,摆动线开始,并产生以下输出:

avg(x) = 0.257250, avg(y) = 23.736000, avg(z) = 116.620125

如果您认为可能存在空输入(或至少输入中没有HETATM记录)且错误消息不可接受,则可以使用
If(count>0)
或等效工具(添加到脚本中)保护打印操作。如果“count”为零,您可以生成自己的首选输出。

感谢您提供输入数据。请注意,一般来说,您应该提供预期的输出和您迄今为止所付出的最大努力。您希望这里有人教您如何使用awk(这里没有主题),还是希望您在已经编写的awk代码方面得到帮助?我认为是的,这是有意义的,但我不知道。awk如何区分以ATOM开头的字段和以atm开头的字段。因为我的第一个字段中有一个名为ATOM的字段也会一直延伸到第九个字段。例如,我会在我的问题中包括这段代码。这段代码似乎不起作用,它给了我ave(x)=0 avg(y)=0 avg(z)=0
$ awk '{for (i=1;i<=3;i++) sum[i]+=$(i+6)}
    END{if (NR) for (i=1;i in sum;i++) print sum[i]/NR}' file
0.25725
23.736
116.62
avg(x) = 0.257250, avg(y) = 23.736000, avg(z) = 116.620125
$ awk '{for (i=1;i<=3;i++) sum[i]+=$(i+6)}
    END{if (NR) for (i=1;i in sum;i++) print sum[i]/NR}' file
0.25725
23.736
116.62
awk '/HETATM/{++nr; for (i=1;i<=3;i++) sum[i]+=$(i+6)}
    END{if (nr) for (i=1;i in sum;i++) print sum[i]/nr}' file