从文件Bash中添加整数

时间:2014-02-22 21:15:55

标签: linux bash file-io

我需要添加整数并从文件中找到它们之间的平均值。这是他们在文件中的样子

70 80 90

所以在我的bash脚本中我像这样引用它们

    cat num.txt | while read n1 n2 n3
    set $n1 $n2 $n3

当我试图找到平均值时

    avg = $(($n1+$n2+$n3))/3
    echo $avg

这不起作用,我尝试了很多其他的东西,但我想我只是没有正确引用它们

4 个答案:

答案 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