拆分列并计算每个块的平均值

时间:2019-03-25 11:45:55

标签: bash

我有一个看起来像这样的文件(但包含1000个个人):

ind1
0 -14980.8397530869 -15380.4887698560 589.9705014749 0.0001038673
1 -6117.4992483752 -6308.7155249846 2197953628.1638321877 0.0056515118
2 -5944.6996454388 -6135.7353966574 3342427102.6682262421 0.0022743340
3 -5919.1420308529 -6109.6495008350 3808372819.6077227592 0.0013537196
4 -5914.6730224383 -6104.8257104034 4004539990.0168108940 0.0010346189
5 -5913.8449682103 -6103.8235473922 4089253849.9270911217 0.0009059563
ind2
0 -14460.2922418646 -14773.0506815877 589.9705014749 0.0001038673
1 -5920.5367627770 -6029.4001343365 2138866766.8147277832 0.0051484663
2 -5763.8860434281 -5859.2556977093 3233581956.7551069260 0.0019994597
3 -5743.1443207950 -5832.6552230885 3670742051.8126020432 0.0011739290
4 -5740.0577242050 -5826.9514222357 3853293664.2254080772 0.0008832138
5 -5739.7465215368 -5825.4061952257 3932395083.8926229477 0.0007616630

如何计算每个循环中从1到5的行之间第4列和第5列的平均值(独立)?

很快,我想为每个人获取2个平均值(第4列和第5列)。 预先感谢!

1 个答案:

答案 0 :(得分:4)

awk来营救!

$ awk 'function p() {if(c) printf "%s %.10f %.10f\n",  h, s4/c, s5/c}
       /^ind/       {p(); h=$1; c=s4=s5=0; next} 
       $1~/^[1-5]$/ {c++; s4+=$4; s5+=$5} 
       END          {p()}' file

会给予

ind1 3488509478.0767364502 0.0022440281
ind2 3365775904.7000937462 0.0019933464

说明

定义的函数p用于格式化打印标题和两个计算的平均值(平均值)。当遇到标题行时,捕获标题;重置字段4和5变量的计数和总和;当第一个字段为{1..5}递增计数时,将字段值添加到相应的变量中。

在切换到新标题时以及遇到的文件末尾时打印该行。

如果标题不是以{0..5}开头,则可以替换 例如!/^[0-5]/。或者,如果标头只有一个单词,则可以改为进行NF==1检查,或者如果确定它包含至少一个字母,则可以假设您的语言环境对整个字符都具有此范围,可以进行/[a-zA-Z]/

相关问题