如何计算每行累积平均值?现有awk命令输出全0求修正
修正awk命令计算累积平均值的问题
原始数据
1. 800 2. 900 3. 1000 4. 1100 5. 1200
预期输出
1 800 # 800/1 2 850 #(800+900)/2 3 900 #(800+900+1000)/3 4 950 #(800+900+1000+1100)/4 5 1000 #(800+900+1000+1100+1200)/5
原命令的错误点
你给出的命令存在多处问题,导致输出全为0:
- 命令开头的
cat tcat test.txt是笔误,应为cat test.txt(或直接让awk读取文件,无需cat); - 每行处理时都执行
sum=0,直接清空了累积的求和值; - for循环条件
counter >=5逻辑错误,初始值counter=1不满足条件,循环一次都不会执行,sum始终为0; - 完全没必要手动写for循环遍历行,awk本身是逐行处理文本,可利用内置变量实现累积计算。
修正后的命令
基础版(仅输出行号与平均值)
awk '{ sum += $2; print NR, sum/NR }' test.txt
完全匹配预期输出版(带注释)
awk '{ sum += $2 avg = sum / NR # 构建求和表达式 sum_expr = $2 for (i=1; i<NR; i++) { sum_expr = arr[i] "+" sum_expr } # 格式化输出,匹配预期格式 printf "%d %4d # %s/%d\n", NR, avg, (NR==1 ? sum_expr : "(" sum_expr ")"), NR # 存储当前数值到数组,用于后续拼接表达式 arr[NR] = $2 }' test.txt
命令说明
sum += $2:逐行累积求和,sum在awk中默认初始为0,无需手动初始化;NR:awk内置变量,表示当前处理的行数,正好对应预期输出的行号和分母;- 数组
arr用于存储每行的数值,方便后续拼接求和表达式,实现和预期一致的注释内容; printf用于格式化输出,保证数字对齐,匹配预期的格式。
内容的提问来源于stack exchange,提问作者Binh Thien
相关产品推荐
相关产品推荐

