Linux Shell脚本:如何用单行命令计算数值列表的最小值、最大值、中位数和平均值


阅读 4 次

问题场景

在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"
}'