#!/bin/sh # # Copyright (c) 2015 Matthias Kilian # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. set -e TMPDIR=${TMPDIR:-/var/tmp} tmp=$TMPDIR/.karoplapper.$$ mkdir $tmp && trap "rm -rf \"$tmp\"" 0 1 2 3 15 awk ' BEGIN { OFS = "\t" } # Illegal byte sequence (\255idi): NR >= 375219 && NR <= 375221 || \ NR >= 376712 && NR <= 376713 || \ NR == 379765 || \ NR == 386742 || \ NR == 386743 || \ NR == 386747 || \ NR == 386748 || \ NR == 395542 || \ NR == 395699 || \ NR == 395701 || \ NR == 405794 || \ NR == 405835 || \ NR == 407972 || \ NR == 410952 || \ NR == 410954 || \ NR == 410962 || \ NR == 412971 || \ NR == 417643 || \ NR == 417644 || \ NR == 417648 || \ NR == 421428 || \ NR == 421825 || \ NR == 421974 || \ NR == 428890 || \ NR == 437171 || \ NR == 437641 || \ NR == 437642 || \ NR >= 437644 && NR <= 437646 || \ NR == 440267 || \ NR == 441457 || \ NR == 443877 || \ NR == 445262 || \ NR == 448985 || \ NR == 450532 || \ NR == 450671 || \ NR == 450673 {next} # { print "HURZ", $0 > "/dev/stderr"; next } /^[^<]/ { next } # 28.04.2011: BOTRIX WIRD VOM BLITZ GETROFFEN /^/ { next } !/^[^<]*<\/B> / { print "*** " NR $0 > "/dev/stderr" next } { l = length w = $0 sub(/^/, "", w) sub(/<\/B> .*/, "", w) sub(/^[^<]*<\/B>/, "") ll = tolower($0) } a = b = c = d = e = f = g = h = i = j = k = m = x = n = o = p = r = s = t = v = z = 0 ll ~ /([^[:alpha:]]|ge)(reg(en|ne[nt])|schifft)[^[:alpha:]]/ { r = 1 } ll ~ /[^[:alpha:].]php[^[:alpha:]]/ { p = 1 } ll ~ /[^[:alpha:].]cobol[^[:alpha:]]/ { c = 1 } ll ~ /[^[:alpha:].]app[^[:alpha:]]/ { a = 1 } ll ~ /[^[:alpha:].]botrix[^[:alpha:]]/ { b = 1 } ll ~ /[^[:alpha:].]zufi[^[:alpha:]]/ { z = 1 } ll ~ /[^[:alpha:].]nichts[^[:alpha:]]/ { n = 1 } ll ~ /[^[:alpha:].]anders[^[:alpha:]]/ { s = 1 } ll ~ /[^[:alpha:].]blocker[^[:alpha:]]/ { k = 1 } ll ~ /[^[:alpha:].][ij]ehova[^[:alpha:]]/ { j = 1 } ll ~ /[^[:alpha:].]emacs[^[:alpha:]]/ { e = 1 } ll ~ /[^[:alpha:].]vi[^[:alpha:]]/ { v = 1 } ll ~ /[^[:alpha:].](!karoiq!|iq)[^[:alpha:]]/ { i = 1 } ll ~ /[^[:alpha:].]statistik(en)?[^[:alpha:]]/ { t = 1 } ll ~ /[^[:alpha:].]checkpoints?[^[:alpha:]]/ { o = 1 } ll ~ /[^[:alpha:].]troll[^[:alpha:]]/ { x = 1 } ll ~ /[^[:alpha:].]dynamische?[^[:alpha:]]/ { d = 1 } ll ~ /[^[:alpha:].]katzen?[^[:alpha:]]/ { f = 1 } ll ~ /[^[:alpha:].]didi[^[:alpha:]]/ { g = 1 } ll ~ /[^[:alpha:].]mett/ { m = 1 } ll ~ / / { h = 1 } { sub(/^/, "") sub(/<\/B> .*/, "") lines[w]++ bytes[w] += l regen[w] += r php[w] += p cobol[w] += c app[w] += a botrix[w] += b zufi[w] += z nichts[w] += n anders[w] += s blocker[w] += k jehova[w] += j emacs[w] += e vi[w] += v karoiq[w] += i statistik[w] += t checkpoint[w] += o troll[w] += x dynamisch[w] += d tabs[w] += h felines[w] += f didi[w] += g mett[w] += m } END { for (p in lines) print lines[p], bytes[p], regen[p], php[p], \ cobol[p], app[p], botrix[p], zufi[p], \ nichts[p], anders[p], blocker[p], \ jehova[p], emacs[p], vi[p], karoiq[p], \ statistik[p], checkpoint[p], troll[p], \ dynamisch[p], tabs[p], felines[p], \ didi[p], mett[p], p } ' "$@" > "$tmp/chatters" cat <<- EOF Karopapier Chat-Ranking

Die vielleicht überflüssigste Statistik der Welt

Hier stehen jeweils die Top 25 aus dem Karopapier-Chat, aufgeschlüsselt nach verschiedenen Kriterien.

Groß- und Kleinschreibung ist für die Wortzählereien nicht relevant. Ebenso ist nicht relevant, wie oft ein Wort in einer Zeile vorkommt; jede passende Zeile wird nur einmal gezählt.

Das Script, mit dem diese Statistiken gebastelt werden, kann hier eingesehen werden.

Diese Übersicht wird z.Z. stündlich aktualisiert, sofern sich im Chat etwas getan hat. Letzte Aktualisierung war am $(date +%d.%m.%Y\ um\ %H:%M\ Uhr).

EOF out() { printf '

%s

\n\n' "$1" "$2" sort -t \ -k$3rn,$3 "$tmp/chatters" | head -25 | cut -f $3,24 | while read count name; do [ $count -gt 0 ] || break printf '\n' "$name" "$count" done echo '
%s%s
' } out bytes "Plapperkönige nach Bytes:" 2 out zeilen "Plapperkönige nach Zeilen:" 1 echo '

Alle weiteren Angaben ebenfalls in Zeilen.

' out botrix "Plapperkönige, die Botrix gesagt haben:" 7 out katze "Plapperkönige, die Katze oder Katzen gesagt haben:" 21 out didi "Plapperkönige, die Didi gesagt haben:" 22 out zufi "Plapperkönige, die Zufi gesagt haben:" 8 out blocker "Plapperkönige, die Blocker gesagt haben:" 11 out troll "Plapperkönige, die Troll gesagt haben:" 18 out dynamisch "Plapperkönige, die dynamisch (oder dynamische) gesagt haben:" 19 out checkpoint "Plapperkönige, die Checkpoint oder Checkpoints gesagt haben:" 17 out jehova "Plapperkönige, die Jehova (oder Iehova) gesagt haben:" 12 out php "Plapperkönige, die PHP gesagt haben:" 4 out cobol "Plapperkönige, die Cobol gesagt haben:" 5 out app "Plapperkönige, die App gesagt haben:" 6 out regen "Plapperkönige nach Regen (und Varianten wie regnen, (ge)regnet und (ge)schifft):" 3 out nichts "Plapperkönige, die nichts gesagt haben:" 9 out tabs "Plapperkönige, die Tabulatoren (ASCII-Code 9) verwendet haben:" 20 out anders "Plapperkönige, die anders gesagt haben:" 10 out emacs "Plapperkönige, die emacs gesagt haben:" 13 out vi "Plapperkönige, die vi gesagt haben:" 14 out iq "Plapperkönige, die !KaroIQ! oder IQ gesagt haben:" 15 out statistik "Plapperkönige, die Statistik oder Statistiken gesagt haben:" 16 out mett "Plapperkönige, die etwas, das mit Mett beginnt, gesagt haben:" 23 cat <<- 'EOF'

Valid XHTML 1.0! -- Valid CSS! (nämlich gar keins) -- Valid ASCII!

EOF