我有一大块数据,如下所示:
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}'