使用Awk按第三列每0.5单位间隔分组计算第四列平均值
问题背景
现有一份已经按第三列升序排序的文本文件,内容如下:
1 snp1 0.0 4 1 snp2 0.2 6 1 snp3 0.3 4 1 snp4 0.4 3 1 snp5 0.5 5 1 snp6 0.6 6 1 snp7 1.3 5 1 snp8 1.3 3 1 snp9 1.9 4
需求为按第三列每间隔0.5单位分组,计算每组第四列的平均值,期望输出如下:
1 snp1 0.0 4.4 1 snp6 0.6 6.0 1 snp7 1.3 4.0 1 snp9 1.9 4.0
可行Awk解决方案
awk ' BEGIN{ interval=0.5 } NR==1{ pos=$3 sum=$4 cnt=1 save_line=$0 next } $3 >= pos+interval{ split(save_line,arr," ") printf "%s %s %.1f %.1f\n",arr[1],arr[2],arr[3],sum/cnt pos=$3 sum=0 cnt=0 save_line=$0 } { sum+=$4 cnt+=1 } END{ split(save_line,arr," ") printf "%s %s %.1f %.1f\n",arr[1],arr[2],arr[3],sum/cnt } ' input
逻辑说明
- 初始化分组间隔为0.5,读入第一行时初始化当前分组的基准值、第四列累加和、行数计数器,同时保存分组起始行内容
- 每读入一行先判断是否达到下一分组阈值,若达到则先输出上一分组的计算结果,再重置新分组的所有参数
- 所有行都会累计第四列数值和对应行数
- 所有行读取完成后,输出最后一个分组的计算结果
内容的提问来源于stack exchange,提问作者Manav K
相关产品推荐
相关产品推荐

