経緯
前回の記事「紙QSLを書く」でATNOやバンドNEWのチェックをしたと書いたが、その時にチェック漏れが無いかと気になった。RunLogNGの交信履歴をチェックすれば良いのだが一々手作業で行うのも面倒なので何か方法は無いかと考えたのが今回の始まり。
ちょっと苦戦
何時もの様に awk でチョコちょっと書けば良いかと思っていたのが予想外に苦戦した。理由がこちら
- RunLogNG:ログのフィールドが固定では無い
- 例えば、Note の記入があったQSOと無いQSOではADIFのフィールド数が違う
- 要するに必須フィールドとそうでないフィールドが存在するのでフィールドの並び順がQSOによって変わってしまう
そんなんで色々試行錯誤してようやく目的の機能を作成する事が出来た。
作業手順
- RunLogNGのタブ:Logbook から Export all QSO as ADIF を選択し、全QSOのADIFファイルを作成する → 20250528.adif
- 後述するコマンドを入力して、ADIFファイルから、文字列:<qslsdate:8> と <state: を削除する → work.adif 作成
- awkプログラム:conv_full_adif.awk を使ってADIFファイルからCSVファイルを作成する → work.adif to qsll.csv
- awkプログラム:cut_ja_lotw.awk を使ってLOTW未受領&JA以外のリストを作成する → qsll.csv to lotw.csv → lotw.csv が最終目的ファイル
ちょっと解説すると、2.で説明している文字列のフィールドはQSOによって有ったり無かったりしてフィールドの順番を狂わすので予め削除してからawkプログラムに流す様にした訳だ。それと今回はLOTW未受領&JA以外の局の交信履歴+DXCCのエントリーコードを抽出する事にした。このコードを見てプリフィクスを判断する事は難しいがどうしても必要ならSQLサーバに取り込んでマスタと連結しても良いかと思い今回取り込んだ次第である。実際のコマンドがこちら
$ sed -e s/<qslsdate:8>//g" 20250528.adif > wk1.adif
$ sed -e "s/<state://g" wk1.adif > work.adif
$ awk -f conv_full_adif.awk work.adif | sed -e "s/>//g" > qsll.csv
$ awk -f cut_ja_lotw.awk qsll.csv > lotw.csv
実際のプログラム
# RunLogNG のFull ADIFファイルをCSV形式に変換する adif3.1.5対応班
# 2025/05/28 JH3DRN
BEGIN {
FS = "<" #入力セパレータを < とする
OFS= "," #出力セパレータを , とする
}
{
for(i=0;i<1;i++)
{
if(NR>10)
{
(/>/gsub(/ /, "", $2)); print (substr($2,8,index($2,">")+5)), #callの前のヘッダを削除
# callの後のスペース削除
substr($3,12,4) "/" substr($3,16,2) "/" substr($3,18,2), # 日付Form yyyy/mm/dd
substr($4,11,2) ":" substr($4,13,2), # 時刻Form hh:mm
substr($8,8,6), # 周波数切出
substr($9,8,4), # Mode 切出
substr($15,8,3), # DXCC 番号切出
substr($(NF-5),17,1) # LOTW 切出 最終フィールドから遡るフィールド数
}
}
}
END {
}
# 前処理 sed -e "s/<qslsdate:8>//g" 20250528.adif >wk1.adif
# sed -e "s/<state://g" wk1.adif >work.adif
# awk -f conv_full_adif.awk work.adif | sed -e "s/>//g" > qsll.csv
# 変換出来なかった ">" を削除する
#------------------------------------------------------------------------
# 全QSOデータ(qsll.csv) から Lotw 未受領 & JA以外を抽出して lotw.csv に格納する
# cut_ja_lotw.awk 2025/05/28 JH3DRN
BEGIN {
FS = "," #入力セパレータを , とする
OFS= "," #出力セパレータは無しとする
}
{
for(i=0;i<1;i++)
{
if( substr($1,0,2) == "JA" || substr($1,0,2) == "JH" || substr($1,0,2) == "JR" || substr($1,0,2) == "JE" || substr($1,0,2) == "JF" || substr($1,0,2) == "JG" || substr($1,0,2) == "JI" || substr($1,0,2) == "JJ" || substr($1,0,2) == "JK" || substr($1,0,2) == "JL" || substr($1,0,2) == "JM" || substr($1,0,2) == "JN" || substr($1,0,2) == "JO" || substr($1,0,2) == "JP" || substr($1,0,2) == "JQ" || substr($1,0,2) == "JD" || substr($1,0,2) == "JS" || substr($1,0,2) == "7K" || substr($1,0,2) == "7L" || substr($1,0,2) == "7M" || substr($1,0,2) == "7N" || substr($1,0,2) == "8J" || substr($1,0,2) == "8N" || substr($7,0,1) == "Y" )
{
}
else print $0
}
}
END {
}
# awk -f cut_ja_lotw.awk qsll.csv > lotw.csv
#-------------------------------------------------------------------------
そもそもRunLogNGはmac専用なので、対象となる方のPCでは awkもsedも標準装備されていて追加投資なしで試せると思う。awkやsedはやや敷井が高いかも知れないが今回見たいに例題があると取っつき易いのでは無いかと期待して記事を書いている。で、出来上がった結果がこちら
出来上がったファイル
3D2USU,2025/04/20,10:46,24.915,FT8 ,176,N
XR100IARU,2025/04/23,02:54,21.075,FT8 ,112,N
HI8WJI,2025/04/24,07:48,14.075,FT8 ,72 ,N
VE7LGP,2025/04/24,07:50,14.075,FT8 ,1 ,N
AO6IARU,2025/04/24,08:14,28.076,FT8 ,21 ,N
AO5IARU,2025/04/24,10:16,28.074,FT8 ,281,N
R7LD,2025/04/24,10:18,28.074,FT8 ,54 ,N
DK5WL,2025/04/24,10:46,28.074,FT8 ,230,N
OK1ZCF,2025/04/24,10:48,28.074,FT8 ,503,N
PA3EZB,2025/04/24,10:50,28.074,FT8 ,263,N
T77NM,2025/04/24,11:08,24.916,FT8 ,278,N
KP2B,2025/04/25,06:49,18.100,FT8 ,285,N
XE1RP,2025/04/25,06:52,18.100,FT8 ,50 ,N
DO3ME,2025/04/25,10:24,28.076,FT8 ,230,N
ZS8W,2025/05/01,09:21,21.090,FT8 ,201,N
TX9A,2025/05/02,10:15,14.090,FT8 ,508,N
KH0/KC0W,2025/05/04,06:36,50.315,FT8 ,166,N
Z68ZZ,2025/05/07,10:35,21.091,FT8 ,522,N
Z68ZZ,2025/05/08,11:42,28.091,FT8 ,522,N
ZS8W,2025/05/11,05:57,28.080,FT8 ,201,N
Z68ZZ,2025/05/11,09:18,18.091,FT8 ,522,N
ZS8W,2025/05/12,09:48,18.095,FT8 ,201,N
VK6DS,2025/05/16,07:38,50.314,FT8 ,150,N
BX4AP,2025/05/17,02:43,50.314,FT8 ,386,N
BI6NSL,2025/05/17,03:34,50.313,FT8 ,318,N
FR4OM,2025/05/20,10:33,24.915,FT8 ,453,N
当面の使い方としてはこのファイルを見て怪しいそうなQSOをチェックすれば良いかと思っている。その先の事は色々考えられるが、そもそもDXCCのコンファームが270近くになるとそう簡単に増える物でも無いので未請求を防ぐ意味でもこの仕組みは機能してくれると期待している。