2013-10-08 58 views
1

我正在嘗試學習測試,其中一個主題是bash腳本。 我有以下的txt文件:Bash - 無效算術運算符

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線

然後

讓利金額+ = $ {line [1]}

但我仍然收到標題中提到的相同錯誤。

+0

不需要'cut'; 'read'可以用'read id sum'來處理分詞。讓總數+ =總和; done'。 'id'只是第一列的佔位符。 – chepner

回答

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") 
0
cat your_file_name.txt | cut -f2 -d" " | paste -sd+ | bc 

這應該做的工作!

1

我愛AWK:

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

所以在x.txt被存儲的值。請注意,許多答案實際上並沒有計算出平均值,因爲他們最終需要除以行數。通常它會由wc -l < x.txt執行,但在我的解決方案中,您幾乎可以免費獲得它。

+1

我不得不說,我喜歡這個解決方案,但是請注意,OP說'我正在努力學習測試,其中一個主題是bash scripts',所以我們可以猜測這基本上是在尋找一個純粹的bash解。順便說一句,我也愛'awk',它是如此強大的語言! – fedorqui

+0

啊,你說得對,我忽略了它。抱歉。 – math

+0

我認爲它應該是'sum + = $ 2',並且不需要改變輸入分隔符 - 它看起來像OP試圖使用**號碼**來使數字變成粗體,但它不起作用代碼塊。 –

0

有沒有必要使用cat以及read;您可以將文件的內容重定向到循環中。您也不需要使用let進行算術運算。

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

echo $((sum/count)) 

這會給你一個整數結果,作爲慶典不做浮點運算。爲了得到一個浮點結果,你可以使用bc

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

這會給你正確的2位小數的結果。