Plainnotes

awk 按列求和与分组统计

2025-10-22 · 2 分钟工具

日志里有一列是响应时间,想按接口分组算平均值和 99 分位,又不想写 Python。

求和:

awk '{sum+=$NF; n++} END {printf "%.2f\n", sum/n}' access.log

分组:

awk '{c[$7]++; t[$7]+=$NF} END {for (k in c) printf "%-20s %6d %8.1f\n", k, c[k], t[k]/c[k]}' access.log

注意 awk 的关联数组是无序的,要排序得靠 | sort -k2 -nr。大文件用 LC_ALL=C 能快不少,因为跳过 UTF-8 校验。

99 分位 awk 做起来别扭,得把值存进数组再排序,这时候用 sort -n | awk 组合更顺手:

awk '{print $NF}' access.log | sort -n | awk '{a[NR]=$1} END {print a[int(NR*0.99)]}'