终端计算文件最后N行第M列平均值时命令无返回结果求助
问题根源与解决方案
你遇到的问题核心在于**tail -f的特性和awkEND块的执行时机不匹配**:
- 当你给
tail加上-f参数时,它会持续监听文件的新增内容,不会主动终止进程,管道里的输入流会一直保持打开状态。 - 而awk的
END代码块只有在输入流完全结束(也就是上游进程退出)的时候才会执行,所以它会一直等着输入结束,自然不会输出平均值。
针对你的需求(计算当前文件最后200行第2列的平均值)
直接去掉-f参数即可,这时候tail输出完最后200行就会退出,输入流关闭后awk就会执行END块计算并打印平均值:
tail -n 200 filename.asc | awk '{ total += $2 } END { print total/NR }'
如果你的实际需求是实时计算新增行的平均值(包含原200行)
要是你其实想在文件新增内容时,实时更新包含最初200行在内的平均值,可以分两步处理:
- 先计算现有最后200行的总和和行数
- 再监听新增行,基于已有数据实时更新平均值
对应的命令如下:
# 第一步:获取最后200行的总和与行数 read total count <<< $(tail -n 200 filename.asc | awk '{t+=$2} END{print t, NR}') # 第二步:从第201行开始监听新增内容,实时计算平均值 tail -n +201 -f filename.asc | awk -v total="$total" -v count="$count" '{ total += $2 count++ print "当前平均值:", total/count }'
额外验证小技巧
你可以手动测试一下:执行tail -n 200 filename.asc | awk '{print $2}',如果能正常输出第2列内容,那去掉-f后的平均值命令肯定能正常工作。
内容的提问来源于stack exchange,提问作者SKPS
相关产品推荐
相关产品推荐

