GPSロガー(GPS-CS3K使用レポート - きまブログ)で保存されたファイルを,加工しやすいように必要項目だけを抜き出します。
抽出くらいならawkのワンライナーでいけるだろう。と高を括っていましたが,
フォーマットの変換も行うと結構長いワンライナーになってしまいました...
まず,抽出するGPSロガーのフォーマット。
これが,1レコードになります。(場所は,斑尾高原スキー場です。)
$GPGGA,053246,3650.9855,N,13816.5343,E,1,06,01.5,01035.9,M,037.3,M,00,0000*42
$GPGSA,A,3,13,23,17,20,02,04,,,,,,,02.9,01.5,02.4*0A
$GPGSV,3,1,10,04,66,340,34,17,57,171,36,13,51,105,42,23,36,059,40*70
$GPGSV,3,2,10,02,31,300,36,10,24,242,35,20,15,054,38,12,14,299,24*74
$GPGSV,3,3,10,05,09,240,00,30,00,325,00,,,,,,,,*75
$GPRMC,053246,A,3650.9855,N,13816.5343,E,002.2,183.6,291209,,,A*76
$GPVTG,183.6,T,,M,002.2,N,004.0,K,A*05
この中から,移動記録をとるために必要で,取り出したい項目とフォーマットは以下の6項目。
日付(DDMMYY),時刻(hhmmss),経度(度),緯度(度),高度(m),スピード(km/h)
時刻,経度,緯度,高度だけなら,$GPGGAが先頭にある行を抜き出せばよかったのですが,
日付とスピードを同時に抽出するためには,$GPRMC か $GPVTG の行も抜き出さなくてはならないので,
レコード分割をどうするか考えなければなりません。
awkは,改行がレコードの境界のデフォルトであるため,1行1レコードとなりますが,
ここでは「$GPGGA,」というキーワードをレコードの境界に設定します。
これで,上の引用部分が,複数行にわたり,1レコードとして認識されます。
また「-F,」により,カンマがフィールドの境界に設定しているので,
あとは,欲しいデータのフィールドの順番を数えていきます。
そして,抽出するワンライナーは,以下のとおり。
awk -F,
'BEGIN{RS = "\$GPGGA,"};
{printf("%s,%06d,%3.8f,%3.8f,%.1f,%.1f\n",$97,$1+90000,int($4/100)+$4%100/60,int($2/100)+$2%100/60,$9,$107)}'
WG20091228184105a.log
→ awk -F,:デリミタをカンマにする。
→ BEGIN{RS = "\$GPGGA,"}:通常は改行がレコード分割を$GPGGAにする。
→ printf("フォーマット",変数...)
表記 | 意味 | フォーマット | 備考 |
---|---|---|---|
$97 | 日付 | DDMMYY → %s (DDMMYY) | そのまま |
$1+90000 | 時刻 | hhmmss → %06d(hhmmss) | UTCなので90000足してJSTにする。 |
int($4/100)+$4%100/60 | 緯度 | xx度xx.xx分 → %3.8f (度) | int(x/100)で度だけを抽出,x%100/60で分を度に変換 |
int($2/100)+$2%100/60 | 経度 | xx度xx.xx分 → %3.8f (度) | ↑ |
$9 | 高度 | → %.1f (m) | そのまま |
$107 | スピード | → %.1f (km/h) | そのまま |