2012-01-16 68 views
-4

我正在提取文件第四列中的值並嘗試添加它們。第6行錯誤代碼...需要更正

#!/bin/bash 
cat tag_FLI1 | awk '{print $4}'>tags 
$t=0 
for i in `cat tags` 
    do 
     $t=$t+$i (this is the position of trouble) 
    done 
echo $t 

錯誤預先感謝您的寶貴時間。

回答

3

在僅使用awk的任務的情況下:

如果字段是用空格分開:

awk '{ sum += $4 } END { print sum }' tag_FLI1 

否則,使用FS變量,如:

awk 'BEGIN { FS = "|" } { sum += $4 } END { print sum }' tag_FLI1 
+0

'awk'的功能。 8-10行代碼可以用簡單的一行代替。 +1 – 2012-01-16 17:38:25

3

這不是如何你在bash中進行算術運算。從兩個變量xy添加值,並將結果存儲在第三個變量z,它應該是這樣的:

z=$((x + y)) 

但是,你可以更簡單地只是盡一切AWK,免去您awk '{print $4}'有:

awk '{ sum += $4 } END { print sum }' 

awk方法也將正確地處理浮點數,而bash方法不會。

+0

+1關於處理FP編號的建議。我們還可以使用'z = $ [x + y]'或者使用'let'或者使用'expr'來進行bash算法。 – 2012-01-16 17:27:46

1

,可以在短短的一行來完成:

awk '{sum += $4} END {print sum}' tag_FLI1 

但是,如果這是一個學習鍛鍊的bash,看看這個例子:

#!/bin/bash 
sum=0 
while read line; do 
    ((sum += $line)) 
done < <(awk '{print $4}' tag_FLI1) 
echo $sum 

有本質上3個問題與您的代碼:

  1. 變量分配使用VAR=...而不是$VAR=...。請參閱http://tldp.org/LDP/abs/html/varassignment.html
  2. 總結數字的方式不正確。有關如何操作的示例,請參閱arithmetic expansion
  3. 沒有必要使用中間文件來迭代命令的輸出。如上所示使用while循環,但要注意this caveat
+0

儘管您的回答正確並且代碼示例很好,但我不建議將新用戶鏈接到ABS。它包含了很多不好的做法。 – jordanm 2012-01-16 16:23:48

1

您需要使用數字上下文來添加數字。而且,這裏不需要cat,因爲awk可以從文件中讀取。除非您在其他腳本中使用「標籤」,否則不需要創建該文件。另外,如果您使用的是bash而不是perl或php,則在變量賦值的左側不應該有「$」。

t=0 
while read -r i 
do 
    t=$((t + i)) 
done < <(awk '{print $4}' tag_FLI1) 
echo "$t"