将不同数据块中的列的行相乘,将它们加在一起并得到平均值?

将不同数据块中的列的行相乘,将它们加在一起并得到平均值?

我有一大块数据,如下所示:

924
777 777 777 8445.65349
P 9.44657 -0.840283 -0.394467
C 4.0555 -0.683104 -1.70917
P 7.5169 3.54172 2.77681
C 3.21536 2.67146 2.20242
P 4.33641 7.62012 6.10004
C 0.851002 3.61045 5.6153
P -0.884031 7.93847 9.1465

这一直持续到另一个块开始:

C -2.60284 -2.72416 5.53391
P -7.1821 -5.0307 2.45961
C -4.15764 -0.916509 2.41971
P -7.95623 -0.58521 -2.00452
C -3.06671 0.655337 -1.24124    <-- (here is the end of first chunk)
924                             <-- (here another section starts)
777 777 777 8175.13598
P 9.77168 -2.01085 -0.577195
C 5.1768 -1.76539 -1.75107
P 7.16094 2.89923 2.55963
C 2.93574 1.47131 2.21471
P 3.93407 7.32403 5.62331

我想将每行的条目相乘P到下一行P(以连续的方式),然后将它们加在一起并取平均值。

例如:

如果这是第一个 P (P 9.44657 -0.840283 -0.394467) 并且这是第二个 P (P 7.5169 3.54172 2.77681),则... (9.44657×7.5169) + (-0.840×3.541) + (-0.394×2.77) ...并对第二个 P 和第三个 P 重复此操作,依此类推...然后将它们相加并获得平均值,并对遵循相同模式的许多数据块执行此操作。

可以用 来做到这一点吗awk

答案1

以下帮助您重新接收从该生产线开始的所有元素的生产总和P及其数量。

awk '/^P/{for (n=2;n<=NF;n++){sum+=arr[n]*$n;arr[n]=$n;t++}} END{print sum t}'

我不清楚您的意思是什么,chunks但如果您想收到的金额不是文件总数而是单独的部分,您可以按如下方式自由修改程序

awk '/^924$/ && sum != 0 {print sum t; sum=0; t=0} \
     /^P/{for (n=2;n<=NF;n++){sum+=arr[n]*$n;arr[n]=$n;t++}} \
     END{print sum t}'

相关内容