Bash - 无效的算术运算符

时间:2013-10-08 13:48:49

标签: bash

我正在尝试学习测试,其中一个主题是bash脚本。 我有以下txt文件:

123456 100 
654321 50 
203374111 86

我需要得到分数的平均值(第二列中的数字)。

这就是我写的:

cat $course_name$end | while read line; do
    sum=`echo $line | cut -f2 -d" "`
    let total+=$sum
done

我试过

  

读取-a行

然后

  

让sum + = $ {line [1]}

但是我仍然得到标题中提到的相同错误。

4 个答案:

答案 0 :(得分:1)

我喜欢AWK:

awk -F\* '{sum+=$3} END {print sum/NR}' x.txt

因此在x.txt中存储了值。请注意,许多答案实际上并不计算平均值,因为它们需要除以最后的行号。通常它会由wc -l < x.txt执行,但在我的解决方案中,您几乎可以免费获得它。

答案 1 :(得分:0)

你非常接近,这适合我:

while read line; do
    sum=$(echo $line | cut -f2 -d" ")
    echo "sum is $sum"
    let total+=$sum
    echo "total is $total"
done < file

echo "total is $total"

如您所见,没有必要使用cat $course_name$end,这就足够了

while read line
do

done < file

此外,建议使用

sum=$(echo $line | cut -f2 -d" ")

而不是

sum=`echo $line | cut -f2 -d" "`

甚至

sum=$(cut -f2 -d" " <<< "$line")

答案 2 :(得分:0)

cat your_file_name.txt | cut -f2 -d" " | paste -sd+ | bc

这应该可以胜任!

答案 3 :(得分:0)

无需使用cat以及read;您可以将文件的内容重定向到循环中。您也不需要使用let进行算术运算。

sum = 0
count = 0
while read id score; do
    (( sum += score )) && (( ++count ))
done < "$course_name$end"

echo $(( sum / count ))

这将给你一个整数结果,因为bash不进行浮点运算。要获得浮点结果,可以使用bc

bc <<< "scale=2;$a/$b"

这将为您提供正确到2位小数的结果。