2013-04-17 47 views
0

在其基本形式中,我給出了一個文本文件, 2012年總統大選,我需要在Unix中編寫一行shell腳本來確定哪個候選人獲勝。該文件有各種字段,其中一個是CandidateName,另一個是TotalVotes。文件中的每條記錄都是來自州內一個分區的結果,因此任何給定的CandidateName都有很多記錄,所以我希望能夠根據CandidateName對數據進行排序,然後最終將TotalVotes每個唯一的CandidateName(所以總和開始於唯一的CandidateName並且在下一個唯一的CandidateName之前結束)。如何編寫一個Unix Shell來對每個唯一列求一行的值(例如,如何計算每個不同候選人的總票數)

+1

能否請您發表您的輸入文件的摘錄,什麼期望結果是? – cnicutar

回答

1

無需使用awk及其關聯數組進行排序。爲了方便起見,數據文件格式可以是:

precinct1:candidate name1:732 
precinct1:candidate2 name:1435 
precinct2:candidate name1:9920 
precinct2:candidate2 name:1238 

因此,你需要根據現場2 :作爲分隔符創建場3的總和。

awk -F: '{sum[$2] += $3} END { for (name in sum) { print name " = " sum[name] } }' data.file 

awk的某些版本可以在內部進行排序;別人不能。我會使用的排序程序來處理的結果:

sort -t= -k2nb 

(字段分隔符是=標誌;排序是區域2,它是一個數字字段,可能具有前導空白)。

0

不太一條線,而是將工作

$ cat votes.txt 
Colorado Obama  50 
Colorado Romney 20 
Colorado Gingrich 30 
Florida Obama  60 
Florida Romney 20 
Florida Gingrich 30 

腳本

while read loc can num 
do 
    if ! [ ${!can} ] 
    then 
    cans+=($can) 
    fi 
    (($can += num)) 
done < votes.txt 
for can in ${cans[*]} 
do 
    echo $can ${!can} 
done 

輸出

Obama 110 
Romney 40 
Gingrich 60 
相關問題