私のデバイスに気象観測所が接続されていますが、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が必要です。年が最初で最後が秒である固定幅の日付形式を選択すると、日付間の単純な文字列比較を実行できます。