如何编写Linux脚本计算文本文件中某列数据的平均值
如何编写Linux脚本计算文本文件中某列数据的平均值
别担心,刚接触Linux两天就敢尝试写脚本已经超棒了!你选awk完全找对了方向——它就是专门用来处理这种结构化文本(比如按列排列的数据)的工具,我一步步给你讲明白怎么实现。
先从简单的命令开始理解
假设你有一个数据文件,比如叫data.txt,内容大概是这样(列之间用空格/制表符分隔):
1 23 2 45 3 67 4 89
如果我们要计算第二列的平均值,直接用一条awk命令就能搞定:
awk '{sum += $2; count++} END {print "第二列的平均值是:", sum/count}' data.txt
我给你拆解开每个部分的意思:
{sum += $2; count++}:awk会逐行读取文件,每读一行就把当前行第二列($2就是第二列的意思,$1是第一列,以此类推)的数值加到sum(总和变量)里,同时让计数器count加1。END {}:这部分代码会在所有行都处理完之后才执行,我们在这里用总和除以计数,得到平均值并打印出来。
运行这条命令后,你就能看到计算结果啦!
写成可复用的脚本
如果需要经常计算不同文件、不同列的平均值,把命令写成脚本会更方便。我们来写一个叫calc_avg.sh的脚本:
- 先创建脚本文件:
touch calc_avg.sh
- 用编辑器打开(比如
nano calc_avg.sh),把下面的内容粘进去:
#!/bin/bash # 检查用户是否输入了正确的参数 if [ $# -ne 2 ]; then echo "用法:$0 <数据文件名> <要计算的列号>" echo "例子:./calc_avg.sh data.txt 3" exit 1 fi # 把用户输入的参数存成变量 filename=$1 column=$2 # 用awk计算平均值,同时处理非数字的情况 awk -v col="$column" ' { # 只处理列内容是数字(包括小数)的行 if ($col ~ /^[0-9.]+$/) { sum += $col count++ } } END { if (count > 0) { # 格式化输出,保留两位小数,看起来更友好 printf "第%s列的平均值是:%.2f\n", col, sum/count } else { print "错误:第"col"列没有有效的数字数据" } }' "$filename"
- 给脚本加上执行权限:
chmod +x calc_avg.sh
- 运行脚本的例子:
./calc_avg.sh data.txt 2
特殊情况处理
- 如果你的数据是CSV文件(列用逗号分隔),只需要给
awk加-F ','参数指定分隔符,比如:
awk -F ',' '{sum += $2; count++} END {print sum/count}' data.csv
- 如果文件里有空白行或者非数字的内容,我们脚本里的
if ($col ~ /^[0-9.]+$/)已经帮你过滤掉了,不会影响计算结果。
刚开始接触这些命令肯定会有点懵,多试几次,调整参数看看效果,很快就能上手啦!
备注:内容来源于stack exchange,提问作者Mhmoud Njedeen
相关产品推荐
相关产品推荐

