2011-04-05 46 views
0

我有一個包含下列格式的數據文件:總結字段的內容 - 慶典

場1場2 nCalls時間

我的任務就是總結了nCalls和持續時間字段。我到目前爲止寫的代碼如下:

cat ${file} |\ 
while read n1 n2 nCalls nDuration 
do 
    #sumCalls=$((${sumCalls} + ${nCalls})) 
    #sumDuration=$((${sumDuration} + ${nDuration})) 
    sumCalls=`expr ${sumCalls} + ${nCalls}` 
    sumDuration=`expr ${sumDuration} + ${nDuration}` 
    echo "${sumCalls} ${sumDuration}" 
    echo -n "${appName} ${sumCalls} ${sumDuration}" > temp.txt 
done 

tail -n1 temp.txt >> ${outFile} 

上述兩個聲明都不起作用。我得到語法錯誤。

我的問題是:
1.我在哪裏出錯了上面的代碼?
2.有沒有更好的方法來做到這一點比寫入和退出文件?

感謝,
斯利拉姆

+0

什麼是錯誤你正在接受什麼? – 2011-04-05 06:17:06

+0

你的意思是哪個「兩個」陳述(有11行)?首先提示而不是cat $ file |你可以用<$ file來管道。正確的工具是(g)awk。 – flolo 2011-04-05 06:19:06

+0

@flolo:我正在嘗試執行+ =的bash相當的語句。爲了同樣的目的,我嘗試了兩種「種類」的陳述,但其中沒有一種能夠奏效。 – Sriram 2011-04-05 06:41:02

回答

1

這是awk是爲建:

cat ${file} | awk '{c = c + $3; d = d + $4} END {print "APPNAME", c, d}' 

下面的記錄表明它在行動:

pax$ export appName=xyz 

pax$ echo 'a b 1 2 
...> a b 3 4 
...> a b 5 6' | awk -vAPPNAME=${appName} '{c=c+$3;d=d+$4}END{print APPNAME,c,d}' 
xyz 9 12 
1

一個Ruby(1.9+)例如

$ ruby -ane 'BEGIN{c=d=0};c+=$F[2].to_i;d+=$F[3].to_i;END{puts "APPNAME, #{c},#{d}"}' file 
1

如前所述,正確的工具將是awk。

錯誤:代碼很好,運行(尤其是兩個表達式)。 可能的錯誤:

  1. 你不變量初始化總計爲0(如果他們已經值比它可能會產生錯誤的結果
  2. 如果您的文件包含超過4列,你讀的行爲不同。 Read指定最後傳遞的值總是剩下的那一行!也就是說,你的最後一個變量得到一個5列的條目2空間分隔值賦值=>這裏expr可以給出一個語法錯誤解決方案:添加一行5變量REST,4列保持空置,其餘部分保留空餘,