Created
March 19, 2023 20:14
-
-
Save bwbroersma/c87c9f352a3f50abb00661bc7e21b2bf to your computer and use it in GitHub Desktop.
🗳️ Voorlopige zetelberekening voor KCNI2023 met AWK
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/awk | |
# AUTHOR: Benjamin W. Broersma | |
# DISCLAIMER: special cases are *NOT* handled correctly | |
# input: "\d+. \tAanduiding\t123" | |
# output: pipe to $ column -t -s $'\t' -R 1,3,4 -o ' | ' | |
# call like: | |
# $ curl -sSfA '' https://www.denhaag.nl/nl/in-de-stad/nieuws/voorlopige-uitslag-verkiezing-kiescollege-niet-ingezetenen-1.htm --compressed | xmllint --html --xmlout - 2>/dev/null | xmlstarlet sel -t -m '/_:html/_:body//_:table/_:tbody/_:tr[position()!=last()]' -c '_:td[1]/text()' -o $'\t' -c '_:td[2]/text()' -n -b | cut -c2- | awk -f kcni2023.awk | column -t -s $'\t' -R 1,3,4 -o ' | ' | |
BEGIN { | |
FS = "\t|\\. "; | |
} | |
function dhondt(r) | |
{ | |
max = -1; | |
j = -1; | |
for (nr in lijstaanduiding) { | |
gemiddelde = lijststemmen[nr] / (lijstzetels[nr] + 1); | |
if (gemiddelde > max) { | |
max = gemiddelde; | |
j = nr; | |
} | |
} | |
lijstzetels[j] += 1; | |
print "Restzetel " r " naar " lijstaanduiding[j] " [" max "]" > "/dev/stderr"; | |
} | |
{ | |
stemmen = gensub(/[.,]/, "", "g", $3); | |
lijstaanduiding[$1] = $2; | |
lijststemmen[$1] = stemmen; | |
geldigestemmen += stemmen; | |
} | |
END { | |
aantalzetels = 25; | |
kiesdeler = geldigestemmen / aantalzetels; | |
for (nr in lijstaanduiding) { | |
zetels = int(lijststemmen[nr] / kiesdeler); | |
vollezetels += zetels; | |
lijstzetels[nr] = zetels; | |
} | |
restzetels = aantalzetels - vollezetels; | |
print "Zetels = " aantalzetels ", Geldige stemmen = " geldigestemmen ", Kiesdeler = " kiesdeler ", Volle zetels = " vollezetels ", Restzetels = " restzetels > "/dev/stderr"; | |
print "\033[1;47;30mLijstnummer\tAanduiding\tAantal stemmen\tZetels\033[0m"; | |
for (r = 1; r <= restzetels; r++) { | |
dhondt(r); | |
} | |
for (nr in lijstaanduiding) { | |
print nr "\t" lijstaanduiding[nr] "\t" lijststemmen[nr] "\t" lijstzetels[nr]; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
See my twitter 🧵 thread.
Usable with e.g.:
Which outputs this to
stderr
:And this to
stdout
: