#!/bin/sh # # "Poor Man's Logbook" by Mats Petersson SM5SXL # cls() { echo  } clear_all_fields() { OLD_DATE=$DATE OLD_TBGN=$TBGN OLD_TEND=$TEND OLD_CALLSIGN=$CALLSIGN OLD_NAME=$NAME OLD_QTH=$QTH OLD_COUNTRY=$COUNTRY OLD_FREQ=$FREQ OLD_MODE=$MODE OLD_PWR=$PWR OLD_HIS_RST=$HIS_RST OLD_MY_RST=$MY_RST OLD_QSL_SENT=$QSL_SENT OLD_QSL_RCVD=$QSL_RCVD OLD_COMMENTS=$COMMENTS DATE="" TBGN="" TEND="" CALLSIGN="" NAME="" QTH="" COUNTRY="" FREQ="" MODE="" PWR="" HIS_RST="" MY_RST="" QSL_SENT="" QSL_RCVD="" COMMENTS="" } restore_fields() { DATE=$OLD_DATE TBGN=$OLD_TBGN TEND=$OLD_TEND CALLSIGN=$OLD_CALLSIGN NAME=$OLD_NAME QTH=$OLD_QTH COUNTRY=$OLD_COUNTRY FREQ=$OLD_FREQ MODE=$OLD_MODE PWR=$OLD_PWR HIS_RST=$OLD_HIS_RST MY_RST=$OLD_MY_RST QSL_SENT=$OLD_QSL_SENT QSL_RCVD=$OLD_QSL_RCVD COMMENTS=$OLD_COMMENTS } init_fields() { clear_all_fields auto_date_time d MODE=$CURMODE QSL_SENT="no" QSL_RCVD="no" QSO_TOTAL=$(awk 'END {print NR}' ~/datafiles/logbook.tab) } draw_screen() { echo -e "1 Date:\t$DATE Total QSO's: $QSO_TOTAL" echo -e "2 Start time:\t$TBGN" echo -e "3 End time:\t$TEND" echo -e "4 Callsign:\t$CALLSIGN" echo -e "5 Name:\t$NAME" echo -e "6 QTH:\t\t$QTH" echo -e "7 Country:\t$COUNTRY" echo -e "8 Freq:\t$FREQ" echo -e "9 Mode:\t$MODE" echo -e "10 Power:\t$PWR" echo -e "11 His RST:\t$HIS_RST" echo -e "12 My RST:\t$MY_RST" echo -e "13 QSL Sent:\t$QSL_SENT" echo -e "14 QSL Rcvd:\t$QSL_RCVD" echo -e "15 Comments:\t$COMMENTS" echo echo -n "Command (1-15, a, c, d, e, f, h, i, k, l, n, p, q, Q, r, s, x): " } chk_first() { if [ $FIRST -eq 0 ]; then AWK_STRING="$AWK_STRING && " fi FIRST=0 } query_callsign() { cls awk "BEGIN {FS = \"\t\"} \$4 ~ /$CALLSIGN/ { printf \"Date: %-12sStart time: %-8sEnd time: %s\n\n\ Callsign: %-15sName: %-15sQTH: %s\n\n\ Country: %s\n\n\ Freq: %-10sMode: %-8sPower: %-8sHis RST: %-6sMy RST: %s\n\n\ QSL sent: %-6sQSL rcvd: %s\n\n\ Comments: %s\n\n\ -----------------------------------------------------------------------------\n\n\", \ \$1, \$2, \$3, \$4, \$5, \$6, \$7, \$8, \$9, \$10, \$11, \$12, \$13, \$14, \$15 } " ~/datafiles/logbook.tab | less } query_all() { local R USE_SORT=0 SORT_OPTS OUT_FILE echo -n "Use 'sort' (y/N)? " read R if [ "$R" = "y" ]; then USE_SORT=1 echo echo -n "Additional 'sort' options: " read SORT_OPTS fi echo echo -n "Output to (S)creen or (f)ile? " read R if [ "$R" = "" ]; then R="s" fi if [ "$R" = "f" ]; then echo echo -n "Filename: " read OUT_FILE fi FIRST=1 AWK_STRING="BEGIN {FS = \"\t\"}; " if [ "$DATE" != "" ]; then chk_first AWK_STRING="$AWK_STRING (\$1 ~ /$DATE/)" fi if [ "$TBGN" != "" ]; then chk_first AWK_STRING="$AWK_STRING (\$2 ~ /$TBGN/)" fi if [ "$TEND" != "" ]; then chk_first AWK_STRING="$AWK_STRING (\$3 ~ /$TEND/)" fi if [ "$CALLSIGN" != "" ]; then chk_first AWK_STRING="$AWK_STRING (\$4 ~ /$CALLSIGN/)" fi if [ "$NAME" != "" ]; then chk_first AWK_STRING="$AWK_STRING (\$5 ~ /$NAME/)" fi if [ "$QTH" != "" ]; then chk_first AWK_STRING="$AWK_STRING (\$6 ~ /$QTH/)" fi if [ "$COUNTRY" != "" ]; then chk_first AWK_STRING="$AWK_STRING (\$7 ~ /$COUNTRY/)" fi if [ "$FREQ" != "" ]; then chk_first AWK_STRING="$AWK_STRING (\$8 ~ /$FREQ/)" fi if [ "$MODE" != "" ]; then chk_first AWK_STRING="$AWK_STRING (\$9 ~ /$MODE/)" fi if [ "$PWR" != "" ]; then chk_first AWK_STRING="$AWK_STRING (\$10 ~ /$PWR/)" fi if [ "$HIS_RST" != "" ]; then chk_first AWK_STRING="$AWK_STRING (\$11 ~ /$HIS_RST/)" fi if [ "$MY_RST" != "" ]; then chk_first AWK_STRING="$AWK_STRING (\$12 ~ /$MY_RST/)" fi if [ "$QSL_SENT" != "" ]; then chk_first AWK_STRING="$AWK_STRING (\$13 ~ /$QSL_SENT/)" fi if [ "$QSL_RCVD" != "" ]; then chk_first AWK_STRING="$AWK_STRING (\$14 ~ /$QSL_RCVD/)" fi if [ "$COMMENTS" != "" ]; then chk_first AWK_STRING="$AWK_STRING (\$15 ~ /$COMMENTS/)" fi AWK_STRING="$AWK_STRING { \ printf \"Date: %-12sStart time: %-8sEnd time: %s\n\n\ Callsign: %-15sName: %-15sQTH: %s\n\n\ Country: %s\n\n\ Freq: %-10sMode: %-8sPower: %-8sHis RST: %-6sMy RST: %s\n\n\ QSL sent: %-6sQSL rcvd: %s\n\n\ Comments: %s\n\n\ -----------------------------------------------------------------------------\n\n\", \ \$1, \$2, \$3, \$4, \$5, \$6, \$7, \$8, \$9, \$10, \$11, \$12, \$13, \$14, \$15 }" cls case $R in s) if [ $USE_SORT -eq 1 ]; then sort -t " " $SORT_OPTS ~/datafiles/logbook.tab | \ awk "$AWK_STRING" | less else awk "$AWK_STRING" ~/datafiles/logbook.tab | less fi ;; f) if [ $USE_SORT -eq 1 ]; then sort -t " " $SORT_OPTS ~/datafiles/logbook.tab | \ awk "$AWK_STRING" > $OUT_FILE else awk "$AWK_STRING" ~/datafiles/logbook.tab > $OUT_FILE fi ;; esac } search_country() { awk "BEGIN { FS = \"\t\" num_found = 0 prefix = ( \":\" substr(\"$CALLSIGN\", 1, $PFX_LEN) \":\" ) cf = \"/home/mats/datafiles/country.tab\" } \$2 ~ prefix { cntry = \$1 while(getline < cf) { if(\$1 == cntry) cntry_arr[num_found++] = \$1 } close(cf) } END { if (! num_found) exit 0 if(num_found > 1) { printf \"\n\" > \"/dev/stderr\" for(i = 0; i < num_found; i++) printf \"(%d) %s \", i + 1, cntry_arr[i] > \"/dev/stderr\" printf \"\n\n%d possible choices, please select one of them: \", num_found > \"/dev/stderr\" getline n < \"/dev/stdin\" n-- print cntry_arr[n] } else print cntry exit 1 } " ~/datafiles/prefix.tab } lookup_country() { PFX_LEN=$(echo -n $CALLSIGN | wc -c) if [ $PFX_LEN -gt 4 ]; then PFX_LEN=4 fi while search_country; do PFX_LEN=$[ $PFX_LEN - 1 ] if [ $PFX_LEN -eq 0 ]; then exit fi done } show_country_data() { cls awk "BEGIN { FS = \"\t\" } \$1 == \"$COUNTRY\" { printf \"\nCountry: %s\n\ Continent: %s\n\ITU Zone: %s\nCQ Zone: %s\nTime Zone: %s\n\ Latitude: %s\n\Longitude: %s\n\n\", \$1, \$2, \$3, \$4, \$5, \$6, \$7 } " ~/datafiles/country.tab read } chk_country() { awk "BEGIN { FS = \"\t\"; found = 0; confirmed = 0 } \$7 == \"$COUNTRY\" { found = 1 if(\$14 == \"yes\") { confirmed = 1 exit } } END { if(! found) print \"'$COUNTRY' is a new country\" else if(! confirmed) print \"'$COUNTRY' worked but not confirmed\" else print \"'$COUNTRY' worked and confirmed\" } " ~/datafiles/logbook.tab read } complete_country() { awk "BEGIN { FS = \"\t\"; n = 0 } \$1 ~ \"$COUNTRY\" { cntry_arr[n++] = \$1 } END { if(! n) { print \"*unresolvable*\" ; exit } if(n > 1) { printf \"\n\" > \"/dev/stderr\" for(i = 0; i < n; i++) printf \"(%d) %s \", i + 1, cntry_arr[i] > \"/dev/stderr\" printf \"\n\nWhich country? \" > \"/dev/stderr\" getline n < \"/dev/stdin\" n-- if(n >= 0) print cntry_arr[n] } else print cntry_arr[0] } " ~/datafiles/prefix.tab } show_countries() { local R echo -n "Show (a)ll DXCC (w)orked (c)onfirmed (u)nconfirmed (n)ot worked? " read R case $R in a) awk 'BEGIN {FS = "\t"} {print $1}' ~/datafiles/prefix.tab | less ;; w) awk 'BEGIN {FS = "\t"} {print $7}' ~/datafiles/logbook.tab | sort -u | less ;; c) awk 'BEGIN {FS = "\t"} $14 == "yes" {print $7}' ~/datafiles/logbook.tab | sort -u | less ;; u) awk 'BEGIN { FS = "\t" } { if($14 == "yes") used[$7] = 1 else if(! ($7 in used)) used[$7] = 0 } END { for (cntry in used) if(used[cntry] == 0) print cntry | "sort -u | less" } ' ~/datafiles/logbook.tab ;; n) awk 'BEGIN { FS = "\t" } { if(! ($7 in used)) used[$7] = 1 } END { while(getline < "/home/mats/datafiles/prefix.tab") { if(! ($1 in used)) print $1 | "less" } close("/home/mats/datafiles/prefix.tab") } ' ~/datafiles/logbook.tab ;; esac } show_stats() { awk 'BEGIN { FS = "\t" } { print $7 | "sort -u >> total.tmp" } $14 == "yes" { print $7 | "sort -u >> confirmed.tmp" } ' ~/datafiles/logbook.tab awk 'END {printf "Total countries: %d ", NR}' total.tmp awk 'END {printf "Confirmed countries: %d\n", NR}' confirmed.tmp read rm total.tmp confirmed.tmp } auto_date_time() { case $1 in d) DATE=$(date -u +"%Y%m%d") ;; s) DATE=$(date -u +"%Y%m%d") TBGN=$(date -u +"%H%M") ;; e) TEND=$(date -u +"%H%M") ;; esac } fixqsl() { awk 'BEGIN {FS = "\t"; OFS = "\t"}; $13 ~ /^send/ {$13 = "yes"}; {print};' ~/datafiles/logbook.tab > ~/datafiles/tmp.tab mv -f ~/datafiles/tmp.tab ~/datafiles/logbook.tab } edit_log() { cd ~/datafiles $EDITOR logbook.tab cd - } edit_prefix_data() { cd ~/datafiles $EDITOR prefix.tab cd - } show_help() { cls echo "Command help" echo "------------" echo echo "a add record to logbook data file" echo "c clear all fields" echo "d show data on current country" echo "e edit logbook data" echo "f change 'QSL Sent' fields from 'send' to 'yes'" echo "h this help page" echo "i initialize fields" echo "k check for new / un-confirmed country" echo "l lookup country" echo "n show statistics" echo "p edit prefix data" echo "q query on callsign only" echo "Q query on all fields" echo "r restore fields saved at last 'c' command" echo "s show countries" echo "x exit program" read } ######################################################################### ######################################################################### cls CURMODE="cw" init_fields R="" while [ "$R" != "x" ]; do cls draw_screen read R echo case $R in 1) echo -n "Date (enter 'd' to insert current date): " read DATE case $DATE in d) auto_date_time d ;; esac ;; 2) echo -n "Start time (enter 's' to insert current time): " read TBGN case $TBGN in s) auto_date_time s ;; esac ;; 3) echo -n "End time (enter 'e' to insert current time): " read TEND case $TEND in e) auto_date_time e ;; esac ;; 4) echo -n "Callsign: " read CALLSIGN COUNTRY="" # if [ "$CALLSIGN" != "" ]; then # COUNTRY=$(lookup_country) # fi ;; 5) echo -n "Name: " read NAME ;; 6) echo -n "QTH: " read QTH ;; 7) echo -n "Country: " read COUNTRY if [ "$COUNTRY" != "" ]; then COUNTRY=$(complete_country) fi ;; 8) echo -n "Freq: " read FREQ ;; 9) echo -n "Mode (Cw Lsb Usb Fm Rtty Amtor Pactor pacKet Sstv): " read tmp case $tmp in c) CURMODE="cw" ;; l) CURMODE="lsb" ;; u) CURMODE="usb" ;; f) CURMODE="fm" ;; r) CURMODE="ry" ;; a) CURMODE="amt" ;; p) CURMODE="ptr" ;; k) CURMODE="pkt" ;; s) CURMODE="sstv" ;; esac MODE=$CURMODE ;; 10) echo -n "Power: " read PWR ;; 11) echo -n "His RST: " read HIS_RST ;; 12) echo -n "My RST: " read MY_RST ;; 13) echo -n "QSL Sent: " read QSL_SENT ;; 14) echo -n "QSL Rcvd: " read QSL_RCVD ;; 15) echo -n "Comments: " read COMMENTS ;; a) echo -n "Add this record to logbook (y/n)? " read ADD_OK if [ "$ADD_OK" = "y" ]; then echo echo Updating logbook... echo -e "$DATE\t$TBGN\t$TEND\t$CALLSIGN\t$NAME\t$QTH\t$COUNTRY\t$FREQ\t$MODE\t$PWR\t$HIS_RST\t$MY_RST\t$QSL_SENT\t$QSL_RCVD\t$COMMENTS" >> ~/datafiles/logbook.tab init_fields sleep 1 fi ;; c) clear_all_fields ;; d) show_country_data ;; e) edit_log ;; f) fixqsl ;; h) show_help ;; i) init_fields ;; k) chk_country ;; l) if [ "$CALLSIGN" != "" ]; then COUNTRY=$(lookup_country) fi ;; n) show_stats ;; p) edit_prefix_data ;; q) query_callsign ;; Q) query_all ;; r) restore_fields ;; s) show_countries ;; esac done cls .