昨日作ったスクリプトで手持ちのシールにQSOデータを印刷して久しぶりに紙カード発行作業を行った。やっぱり楽だわ〜。 カードにシールを貼ってサインして積んでおくだけでアルファベット順にソートされるのでほぼそのままビューロに送れる。 と思っていたのだがJA向けの段になってふと疑問が。単純にソートしているので。 JA1 の次はJA2 のラベルが印刷されてしまう。JARLの規定では
となっていて、 JA1, JE1, JF1 .......JA2, JE2 .... の様な順序に揃えなければならない。まあ、JAとの交信は少ないので良いかとも思ったが、 どうもしっくりこないので何とか考えてみた。昨日までのソートでは JA1,JA2.....JE1,JE2 と並んでしまうのでJARL規定通りに並べる為に次の様なアルゴリズムを考えた。
最初に全QSOを記録したADIFファイルを全QSO-CSVファイルに変換する 次に全QSO-CSVファイルを国内分(ja.sql)と海外分(oversee.csv)に分割する 国内分に関して、ja.csv に対してコールサインの2文字目と3文字目を入れ替えたファイルを作成する。この操作で "JH3DRN"は"J3HDRNと変換される。 ここで作成された ja.csv をソートして再び、2文字目と3文字目を入れ替える。
awk -f get_ja.awk qsl.csv > ja.csv
awk -f cut_ja.awk qsl.csv > oversee.csv
awk -f conv_ja.awk ja.csv | sort | awk -f conv_ja.awk | sed -e "s/,,,/,/g" > ja_s.csv
(ja_s.csv に正しくソートされた国内QSOデータが格納される)
awk -f conv.awk 0915.adi| sort | sed -e "s/MFSK/FT4 /g" > qsl.csv
各スクリプトは次の通り
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
# コールサインの2文字目と3文字目を入れ替える conv_ja.awk
# 2022/09/16 JH3DRN
BEGIN {
FS = "," #入力セパレータを , とする
OFS= "" #出力セパレータは無しとする
}
{
for(i=0;i<1;i++)
{
OFS="" # 出力セパレータを無しに設定
print substr($1,0,1),substr($1,3,1),
substr($1,2,1),substr($1,5,1)substr($1,5,1)substr($1,6,1),
substr($1,7,1),substr($1,8,1)substr($1,9,1)substr($1,10,1),
OFS=",", # 出力セパレータを , とする
$2,$3,$4,$5,$6,$7
}
}
END {
}
# $awk -f conv_ja.awk ja.csv | sort | awk -f conv_ja.awk | sed -e "s/,,,/,/g" > ja_s.csv
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
- 全QSOデータから国内局のみ抽出する
#----------------------------------------------------------
# 全QSOデータ(qls.csv) から国内局のみ抽出して ja.csv に格納する
# get_ja.awk 2022/09/16 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" )
{
print $0
}
else
}
}
END {
}
# awk -f get_ja.awk qsl.csv > ja.csv
#-------------------------------------------------------------
- 全QSOデータから海外局のみ抽出する
#-------------------------------------------------------------
# 全QSOデータ(qls.csv) から国内局のみ抽出して oversee.csv に格納する
# cut_ja.awk 2022/09/16 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" )
{
}
else print $0
}
}
END {
}
# awk -f cut_ja.awk qsl.csv > oversee.csv
#-------------------------------------------------------------
<同一局複数交信問題>
RUMlogNGではQSL印刷範囲に同一局が存在した場合(バンド違い)一枚のラベルに最大3~5交信までを印刷する事が出来る。(ラベルサイズによるらしい) さすがにそこまで実装出来ないので今回は見送ったが、QSLがソートされる事で”同一局”であることが認識出来るので、 2交信程度であれば1枚のQSLカードに2枚のラベルを貼る事とした。3QSO以上と言うのはまず無いのでこれで良しとする。
!修正!
国内局を抽出するcut_ja.awk, get_ja.awk で 7J, 8J を入れていましたが、これらのコールは国外に含めた方が処理しやすいと思うのでスクリプトから削除しました、(2022/09/19)
!修正!
前述の様に考えたのですが、国内QSOだけ抽出する意味では、7J, 8J等も取り込んだ方が便利と考える方もおられると思いましたので元に戻しました。
!修正!
前の記事が見にくかったのでMarkdownで書いて見ました。まだうろ覚えですが多少は見やすくなったと思います