1

我正在尝试学习测试,其中一个主题是 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

我试过了

而读-一行

接着

让 sum+=${line[1]}

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

4

4 回答 4

1

我爱 AWK:

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

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

于 2013-10-08T14:09:15.120 回答
0
cat your_file_name.txt | cut -f2 -d" " | paste -sd+ | bc

这应该做的工作!

于 2013-10-08T13:53:38.750 回答
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")
于 2013-10-08T13:52:17.350 回答
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 位的结果。

于 2014-08-22T13:37:54.223 回答