Anreichern eines Logbuches um die DIG-Nummer mit AWK und SED

Ein OM fragte mich folgendes: Ich habe eine Liste der DIG-Mitglieder und mein Logbuch als CSV-Datei. Nun möchte ich alle DIG-Mitglieder, welche auch in meinem Logbuch auftauchen, mit ihrer DIG-Nummer versehen.

Da er sich mit Tabellen-Kalkulation herumquälte und ich selbst nach 30 Minuten zu keiner Lösung bzgl. Excel und Co. gelangt war (extrem nervig), sagte ich ihm: Schicke mir bitte deine Dateien und ich mach das.

Da ich mal wieder die Kommandozeile bemühen wollte, ich komme kaum noch dazu, nahm ich mir die üblichen Verdächtigen vor: BASH, AWK und SED. Es machte Spaß, mal wieder auf dieser Ebene zu coden.

Sicher kann man hier noch verfeinern, die Skripte sind einfach zusammengesteckt und man kann alles schöner machen. Ich verzichtete bewusst auf JAVA, GUI, TKL/TK etc.

Auf alle Fälle ist man gehalten, bei Verwendung noch einmal stichprobenartig nachzuprüfen. Da übernehme ich keine Gewähr.

So entstanden folgende kurze Skripte:

1. Extraktion aller Rufzeichen der DIG-Liste unter Verlust der SWL ohne Rufzeichen


# cat file | take field 4 or 5 in respect of SWL | avoid SWL without CALLSIGN \N | strip \"
cat DIGLISTE.txt | awk -F , '{if($4~/^\"SWL.*/) print $3";"$5 ; else print $3";"$4;}' | grep -v "\\N" | sed 's/\"//g' | sed 's/ /-/g' sort > DIGLISTE.extract

Bei der DIG muss nach deren Nummer sortiert werden, deshalb unser ’sort‘ am Schluss. Die SWL-Nummern müssen gesondert gelesen werden.

HINWEIS: Alle SWL ohne Rufzeichen werden nicht behandelt. In den Rufzeichen werden Leerzeichen durch ‚-‚ ersetzt. Da gab es einen OK2-SWL, bei dem ein Leerzeichen vorhanden war und  somit später bei der Suche falsche Zeilen mit übernommen wurden – alle mit ‚OK2‘.

2. Extraktion aller Rufzeichen unter Entfernung von Pre- und den vorkommenden Suffixen


# cat file | take field 6 | remove suffixes '/P', '/QRP', '/{NUMBER} | remove CEPT prefix
cat LOG_YYYYY.CSV | awk -F ";" '{print $6}' | sed 's@/P$@@g' | sed 's@/QRP$@@g' | sed 's@/M$@@g' | sed 's@/[0-9]$@@' | awk -F "/" '{if($2 == "")print $1; else print $2;}' > LOG_YYYYY.extract

Da fehlen noch Suffixe … 😉

3. Logbuchauszug mit vorangestellter DIG-Nummer erstellen

occurences.sh:
#/bin/bash
#
# Creates a new logfile with DIG number appended
#
# @author Hendrik Spiewok
# @created 18.01.2015

if [ $# -lt 3 ]
then
echo „USAGE: occurences.sh CALL_DIG_FILE CALLS_OF_LOGFILE LOGFILE“
exit 1
fi

# read the logfile into the memory
STOREIFS=$IFS
IFS=$’\n‘
LOGFILELINES=($(cat $3))
IFS=$STOREIFS

LineNumberInLogFile=““
CALLSIGN=““

# iterate DIG_NUMBER;CALLSING to get the log lines with callsign
for CALLSIGN_DIG_NUMBER in `cat $1`
do
CALLSIGN=`echo $CALLSIGN_DIG_NUMBER | cut -d“;“ -f2`
LineNumberInLogFile=`grep -n $CALLSIGN $2 | cut -d: -f1`

if [ ${#LineNumberInLogFile} -gt 0 ]
then
for LINENUMBER in $LineNumberInLogFile
do
# 1 for zero based array index
echo $CALLSIGN_DIG_NUMBER“;“${LOGFILELINES[$((LINENUMBER-1))]}
done

fi
done

 

4. Aufruf

./occurences.sh DIGLISTE.extract LOG_YYYYY.extract LOG_YYYYY.CSV > DIG_LOG_EXCTRACT.CSV

Das redundante Call am Anfang, habe ich noch aus Überprüfungszwecken mitgeführt.