如何从 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

然后,您可以在脚本中浏览数据并提取您感兴趣的条目。例如,要在 shell 脚本中使用最近 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 }
'

请注意,由于该行的开头有一个额外的字段,因此您现在需要 $7 来填充字段 $6。通过选择固定宽度的日期格式,首先是年份,最后是秒,我们可以在日期之间进行简单的字符串比较。

相关内容