#!/bin/bash # file: townandmail.sh # user: bernd@nr18.space # date: 20.08.2021 # # funktionsweise: # # zur vorbereitung werden aus der datei dfbasic plz, ort und # gemeindeschlüssel extrahiert und alle doppelten einträge entfernt. der # daraus resultierende datensatz wird in der datei $GS_FILE gespeicher. # # das script läuft dann zuerst durch die datei mit den email adressen. jeder # datensatz wird in die datei $TMP_OUT geschieben. gleichzeitig wird # versucht mit plz und ort des datensatzes aus der datei $GS_FILE den # gemeindeschlüssel zu bekommen. gelingt dies, wird der schlüsel zusammen # mit der email adresse in die datei $GS_MAIL geschrieben. # # im zweiten durchlauf gehen wir durch die datei ohne mail-adressen. zuerst # überprüfen wir, ob es eventuell schon einen äquivalenten datensatz in der # ausgabedatei ($TMP_OUT) gibt. gibt es noch keinen datensatz, versuchen wir # für plz und ort einen gemeindeschlüssel zu bekommen. haben wir einen # gemeindeschlüsssel, schauen wir in der datei $GS_MAIL nach, ob dort ein # eintrag für diesen schlüssel existiert. im erfolgsfall ordnen wir die dort # gefundene email adresse dem datensatz zu und speichern ihn in $TMP_OUT. # gibt es keinen gemeindeschlüssel oder keine dazu gehörige email adresse, # wird der datensatz mit einer kurzen fehlermeldung in $FALLOUT gespeichert. # # abschließend werden die gewonnen daten je nach option in eine datei # geschrieben oder nach stdout ausgegeben. # # todo: # # 1.) rückgabewerte der einzelnen schritte überprüfen! umask=077 PROGRAMM_NAME=`basename $0` DEBUG=0 VERBOSITY=0 NEW_GS=0 KEEP_FAILS=0 OHNE_MAIL="" MIT_MAIL="" OUTPUT="" GS_FILE="gemeindeschluessel.csv" TMP_OUT="tam_output.csv" GS_MAIL="tam_gs_mail.csv" FALLOUT="tam_fallout.csv" DATASETS=0 MATCH=0 FAILS=0 usage_and_exit() { # ausgabe einer kurzen hilfe cat <$GS_FILE msg "OK" gs=$(wc -l $GS_FILE | cut -d " " -f 1) msg "Found $gs community keys." } # start des programmes # CLI optionen auswerten, eventuell datei mit den gemeindeschlüsseln neu # erstellen und leere temporäre dateien erstellen. while getopts dghi:km:o:v opt ; do case $opt in d) DEBUG=1;VERBOSITY=1;; g) NEW_GS=1;; h) usage_and_exit 0;; i) OHNE_MAIL="$OPTARG";; k) KEEP_FAILS=1;; m) MIT_MAIL="$OPTARG";; o) OUTPUT="$OPTARG";; v) VERBOSITY=1;; esac done if [ "$NEW_GS" -eq 1 ] ; then gs_factory exit 0 fi if [ -z "$OHNE_MAIL" ] || [ -z "$MIT_MAIL" ] ; then echo "Error: One or both input files are missing." usage_and_exit 1 fi msg "Use input files $OHNE_MAIL, $MIT_MAIL." msg "Verbosity: $VERBOSITY, DEBUG: $DEBUG, KEEP FAILS: $KEEP_FAILS." printf "%s" "" >$GS_MAIL printf "%s" "" >$TMP_OUT printf "%s" "" >$FALLOUT # wenn die option debug gesetzt wurde, sollen die temporären dateien # erhalten bleiben. per default werden sie gelöscht. trap "exit 1" SIGINT SIGHUP SIGTERM SIGQUIT SIGPIPE if [ "$DEBUG" -eq 0 ] ; then if [ "$KEEP_FAILS" -eq 1 ] ; then trap "rm -f $GS_MAIL $TMP_OUT" EXIT else trap "rm -f $GS_MAIL $FALLOUT $TMP_OUT" EXIT fi fi # wir schneiden aus beiden eingabedateien die plz und den ort heraus, # sortieren die daten, entfernen doppelte einträge und zählen diese. DATASETS=$(awk -F ',' '{ print $2","$1 }' $OHNE_MAIL $MIT_MAIL | sort -u | wc -l) msg "Found $DATASETS unique records." # zuerst gehen wir duch die datei mit den email-adressen. dabei versuchen # wir für jede zeile für die plz und den ort in der datei mit den # gemeindeschlüssel ($GS_FILE) diesen schlüssel zu finden. gelingt uns # dies, ordnen wir die e-mail adresse diesem schlüssel zu und schreiben das # ergenis in eine datei ($GS_MAIL). alle zeilen werden in die datei $TMP_OUT # geschriben. msg_start "Try to match postalcode and townname with community key ... " while IFS=, read -r ort plz mail; do gs=$(grep "$plz" $GS_FILE | grep ",$ort," | cut -d ',' -f 3) if [ -z "$gs" ] ; then FAILS=$(expr $FAILS + 1) else MATCH=$(expr $MATCH + 1) echo "$gs,$mail" >>$GS_MAIL fi echo "$plz,$ort,$mail" >>$TMP_OUT done <$MIT_MAIL msg "OK" msg "$MATCH postalcodes and townname matsches" msg "$FAILS postalcode and townname doesnt matchs" # im zweiten durchlauf gehen wir durch die datei ohne mail-adressen. zuerst # überprüfen wir, ob es eventuell schon einen eintrag in der ausgabedatei # ($TMP_OUT) gibt. Gibt es keinen, versuchen wir für plz und ort einen # gemeindeschlüssel zu bekommen. wenn dies gelingt, holen wir uns aus der # datei mit den gemeindeschlüsseln die dafür (hoffentlich bereits bekannte) # email-adresse. Könnte man vielleicht in einem durchlauf erledigen! msg_start "Try to match email with community key ... " MATCH=0 FAILS=0 while IFS=, read -r ort plz ; do resp=$(grep "$plz" $TMP_OUT | grep ",$ort,") if [ -z "$resp" ] ; then gs=$(grep "$plz" $GS_FILE | grep ",$ort," | cut -d ',' -f 3) if [ -z "$gs" ] ; then FAILS=$(expr $FAILS + 1) echo "$plz,$ort,cant get community key" >>$FALLOUT else mail=$(grep "$gs" $GS_MAIL | cut -d ',' -f 2) if [ -z $mail ] ; then FAILS=$(expr $FAILS + 1) echo "$plz,$ort,cant get email for $gs" >>$FALLOUT else echo "$plz,$ort,$mail" >>$TMP_OUT MATCH=$(expr $MATCH + 1) fi fi fi done <$OHNE_MAIL msg "OK" msg "$MATCH community codes successfull matched" msg "$FAILS failed" match=$(wc -l $TMP_OUT | cut -d " " -f 1) fail=$(wc -l $FALLOUT | cut -d " " -f 1) printf "%5s unique records.\n" "$DATASETS" printf "%5s records successfull proceeded.\n" "$match" printf "%5s records failed.\n" "$fail" if [ -z "$OUTPUT" ] ; then sort -u $TMP_OUT else sort -u $TMP_OUT >$OUTPUT fi