arrays - bash- 求行中数字的平均值

标签 arrays bash expr

我正在尝试逐行读取文件并找出每行中数字的平均值。我收到错误:expr: non-numeric argument

我已将问题缩小到 sum=expr $sum + $i,但我不确定为什么代码不起作用。

while read -a rows
do
    for i in "${rows[@]}"
    do
        sum=`expr $sum + $i`
        total=`expr $total + 1`
    done
    average=`expr $sum / $total`
done < $fileName

文件看起来像这样(数字用制表符分隔):

1       1       1       1       1
9       3       4       5       5
6       7       8       9       7
3       6       8       9       1
3       4       2       1       4
6       4       4       7       7

最佳答案

通过一些小的更正,您的代码运行良好:

while read -a rows
do
    total=0
    sum=0
    for i in "${rows[@]}"
    do
        sum=`expr $sum + $i`
        total=`expr $total + 1`
    done
    average=`expr $sum / $total`
    echo $average
done <filename

使用样本输入文件,产生的输出是:

1
5
7
5
2
5

请注意,答案就是答案,因为 expr 只进行整数运算。

使用 sed 对 expr 进行预处理

上面的代码可以重写为:

$ while read row; do expr '(' $(sed 's/  */ + /g' <<<"$row") ')' / $(wc -w<<<$row); done < filename
1
5
7
5
2
5

使用 bash 的内置算术能力

expr 是过时的。在现代 bash 中:

while read -a rows
do
    total=0
    sum=0
    for i in "${rows[@]}"
    do
        ((sum += $i))
        ((total++))
    done
    echo $((sum/total))
done <filename

使用 awk 进行浮点运算

因为 awk 进行浮点运算,所以它可以提供更准确的结果:

$ awk '{s=0; for (i=1;i<=NF;i++)s+=$i; print s/NF;}' filename
1
5.2
7.4
5.4
2.8
5.6

关于arrays - bash- 求行中数字的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32917920/

相关文章:

BASH find -name(读取变量)

java - 无法将值从 Bash 脚本传递到 Java 程序

regex - 惰性正则表达式运算符在 bash 中不起作用

julia - 如何根据函数和参数类型获取julia代码的表达式?

javascript - Highcharts 返回错误 #15

如果在 List 或 Map 中对数组进行注释,则 Java 8 TYPE_USE 注释不起作用

php - 在 MySQL/PHP 查询中有效显示 strtotime()

PHP查找多维数组的数组索引键更新数组

python - 如何从一个大文件中随机删除多行?

bash - 是否可以设置 cron 作业或 bash 脚本从现在开始运行 X 分钟?