我需要添加整数并从文件中找到它们之间的平均值。这是他们在文件中的样子
70 80 90
所以在我的bash脚本中我像这样引用它们
cat num.txt | while read n1 n2 n3
set $n1 $n2 $n3
当我试图找到平均值时
avg = $(($n1+$n2+$n3))/3
echo $avg
这不起作用,我尝试了很多其他的东西,但我想我只是没有正确引用它们
答案 0 :(得分:1)
你可能会做的最好:
set -- $(cat num.txt)
SUM=0
for i in "$@"
do ((SUM+=${i}))
done
echo "Sum = $SUM; Average = $(($SUM / $#))"
这假定(Fredrik Pihl指出comment)整数算术就足够了。如果您需要浮点运算,请使用bc
(假设它已安装在您的系统上;如果不是,请获取它!)。
set -- $(cat num.txt)
SUM=$(echo "$*" | sed 's/ / + /g' | bc -l)
AVG=$(echo "$SUM / $#" | bc -l)
echo "Sum = $SUM; Number = $#; Average = $AVG"
如果您考虑到这一点,您可以设计机制,在bc
的单个调用中同时执行求和和平均值。 -l
选项的比例为20(小数点后20位)。如果过多,请使用以下变体:
SUM=$(echo "$*" | sed 's/ / + /g; s/^/scale=2; /' | bc)
如果你觉得这太笨拙,可能是时候转向脚本语言,如awk
,Perl或Python。
答案 1 :(得分:1)
尝试类似:
while read n1 n2 n3; do
avg=$((($n1 + $n2 + $n3)/3))
echo $avg
done < num.txt
这对浮点数不起作用。 Bash
本身不支持浮点。为此您需要这样做:
avg=$(echo "($n1 + $n2 + $n3)/3" | bc)
这是从文件中读取的好reference。
答案 2 :(得分:1)
awk是一个更好的工具,因为它已经逐行处理输入文件。考虑一下这个awk脚本:
awk '{for (c=1; c<=NF; c++) sum+=$c; printf "%.2f", sum/NF}' file
awk
的优势还在于它支持浮点运算的能力(正如您在"%.2f"
输出格式中所看到的那样)。
答案 3 :(得分:0)
我有点晚了,但是,对于每行的任意数量的数字,它都是纯粹的bash:
while read -a v; do
s=0
for x in ${v[@]}; do (( s += x )); done
echo $(( s / ${#v[@]} ))
done < num.txt