Skip to content

Instantly share code, notes, and snippets.

@bwbroersma
Created March 19, 2023 20:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bwbroersma/c87c9f352a3f50abb00661bc7e21b2bf to your computer and use it in GitHub Desktop.
Save bwbroersma/c87c9f352a3f50abb00661bc7e21b2bf to your computer and use it in GitHub Desktop.
🗳️ Voorlopige zetelberekening voor KCNI2023 met AWK
#!/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];
}
}
@bwbroersma
Copy link
Author

See my twitter 🧵 thread.

Usable with e.g.:

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 ' | '

Which outputs this to stderr:

Zetels = 25, Geldige stemmen = 25848, Kiesdeler = 1033.92, Volle zetels = 18, Restzetels = 7
Restzetel 1 naar Volt [983.5]
Restzetel 2 naar CDA [978]
Restzetel 3 naar SP (Socialistische Partij) [952]
Restzetel 4 naar GROENLINKS  [948.2]
Restzetel 5 naar Partij voor de Dieren [936]
Restzetel 6 naar VVD [926.5]
Restzetel 7 naar Forum voor Democratie [904]

And this to stdout:

Lijstnummer | Aanduiding                                   | Aantal stemmen | Zetels
          1 | VVD                                          |           3706 |      4
          2 | Partij voor de Dieren                        |           1872 |      2
          3 | Partij voor de Arbeid (P.v.d.A.)             |           2160 |      2
          4 | Forum voor Democratie                        |           1808 |      2
          5 | Staatkundig Gereformeerde Partij (SGP)       |            542 |      0
          6 | SP (Socialistische Partij)                   |            952 |      1
          7 | 50PLUS                                       |            475 |      0
          8 | Volt                                         |           1967 |      2
          9 | Lijst met als eerste kandidaat Fiole, E.R.W. |            110 |      0
         10 | GROENLINKS                                   |           4741 |      5
         11 | CDA                                          |            978 |      1
         12 | D66                                          |           4186 |      4
         13 | JA21                                         |           2351 |      2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment