0

在其基本形式中,我收到了一个包含 2012 年总统选举的州投票结果的文本文件,我需要在 Unix 中编写一个单行 shell 脚本来确定哪个候选人获胜。该文件有多个字段,其中一个是 CandidateName,另一个是 TotalVotes。文件中的每条记录都是来自州内一个选区的结果,因此任何给定的 CandidateName 都有很多记录,所以我想做的是根据 CandidateName 对数据进行排序,然后最终将 TotalVotes 求和每个唯一的 CandidateName(因此总和从唯一的 CandidateName 开始,在下一个唯一的 CandidateName 之前结束)。

4

2 回答 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 回答