在其基本形式中,我收到了一个包含 2012 年总统选举的州投票结果的文本文件,我需要在 Unix 中编写一个单行 shell 脚本来确定哪个候选人获胜。该文件有多个字段,其中一个是 CandidateName,另一个是 TotalVotes。文件中的每条记录都是来自州内一个选区的结果,因此任何给定的 CandidateName 都有很多记录,所以我想做的是根据 CandidateName 对数据进行排序,然后最终将 TotalVotes 求和每个唯一的 CandidateName(因此总和从唯一的 CandidateName 开始,在下一个唯一的 CandidateName 之前结束)。
问问题
1145 次
2 回答
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 上,这是一个数字字段,可能带有前导空格)。
于 2013-04-17T03:38:51.273 回答
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
于 2013-04-17T04:03:31.257 回答