问题场景
在Linux系统管理和数据处理中,我们经常需要快速统计数值列表的基本统计量。比如分析服务器日志中的响应时间、监控系统资源使用情况等场景。
解决方案
这里介绍几种高效的方法,适用于整数和浮点数处理:
方法一:使用awk命令
这是最灵活高效的方式,支持整数和浮点数:
cat numbers.txt | awk '{ sum+=$1; nums[NR]=$1 } END { asort(nums); print "最小值:", nums[1]; print "最大值:", nums[NR]; print "中位数:", (NR%2==1) ? nums[int(NR/2)+1] : (nums[NR/2]+nums[NR/2+1])/2; print "平均值:", sum/NR; }'
方法二:使用datamash工具
需要先安装datamash(适合批量处理大数据集):
sudo apt-get install datamash # Debian/Ubuntu cat numbers.txt | datamash min 1 max 1 median 1 mean 1
方法三:Python单行命令
适合已安装Python的环境:
cat numbers.txt | python3 -c " import sys, statistics; data = [float(line) for line in sys.stdin if line.strip()]; print(f'最小值: {min(data)}'); print(f'最大值: {max(data)}'); print(f'中位数: {statistics.median(data)}'); print(f'平均值: {statistics.mean(data)}') "
性能对比
方法 | 优点 | 缺点 |
---|---|---|
awk | 无需安装,性能最好 | 代码稍复杂 |
datamash | 语法简洁 | 需要额外安装 |
Python | 功能最强大 | 启动速度较慢 |
实际应用示例
分析Nginx日志中的响应时间(毫秒):
cat access.log | awk '{print $7}' | grep -E '^[0-9]+$' | awk ' BEGIN { max=0; total=0; count=0 } { if($1>max) max=$1; total+=$1; count++; nums[count]=$1 } END { asort(nums); median = (count%2==1) ? nums[int(count/2)+1] : (nums[count/2]+nums[count/2+1])/2; print "响应时间统计:"; print " 最大:", max, "ms"; print " 平均:", total/count, "ms"; print " 中位数:", median, "ms" }'