NMEAストリームで最小/最大/平均を読み取って実行する方法

NMEAストリームで最小/最大/平均を読み取って実行する方法

私のデバイスに気象観測所が接続されていますが、NMEA 0183が表示されます。/tty/USB0

私はデータを解析し、私が望むものをスクリプトに反映する方法を見つけました。

今やるべきことは、/tty/USB0ファイルをファイルに書き込んでから、スクリプトを呼び出すときに特定のカンマ区切りフィールドの最小/最大/平均を再エコーさせることです。

既存コード:気象観測所のデータを一時ファイルに出力した後、そのファイルを画面に表示

#!/bin/sh
awk -F, '/\$WIMDA/ {print $4*1000" millibars""\n" $6" Celsius""\n" $10"% Humidity""\n" "Wind Direction "$14 " Degrees""\n" "Wind Speed "$20*3.6 " km/h""\n"; fflush(); exit }' /dev/ttyUSB0 > weather1.txt
cat weather1.txt

私は$6これをやってやりたいと思います$20

ベストアンサー1

まず、ログファイルにデータを受信したときにデータにタイムスタンプを割り当てることができます。

awk '{print strftime("%Y.%m.%d.%H%M%S ") $0}' </tty/USB0 >>logfile

解析しやすい形式を選択できます。もちろん、データにすでにタイムスタンプが付いている可能性があります。上記は、固定幅の日付と時刻で始まる行を提供します。たとえば、次のようになります。

2015.07.07.093953

その後、スクリプト内のデータを参照して興味のある項目を抽出できます。たとえば、シェルスクリプトで過去24時間の平均/最大値を使用するには、次のようにします。

start=$(date --date="-1 days" +"%Y.%m.%d.%H%M%S")

これにより、同じ形式で24時間タイムスタンプが表示されます。その後、最大値と平均値を取得できます。

awk -v start="$start" <logfile '
$1>=start { if($7>max7)max7 = $7
            tot21 += $21+0
            numdone++
          }
END { printf "max %g, ave %g\n",max7,tot21/numdone }
'

行の先頭に追加のフィールドがあるので、$ 6フィールドを埋めるには$ 7が必要です。年が最初で最後が秒である固定幅の日付形式を選択すると、日付間の単純な文字列比較を実行できます。

おすすめ記事