我正在尝试逐行读取文件并找到每行中数字的平均值。我收到错误: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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)