Como ler e fazer um min / max / avg a partir de um fluxo NMEA

2

Eu tenho uma estação meteorológica anexada ao meu dispositivo cuspindo NMEA 0183 em /tty/USB0

Eu já classifiquei como analisar os dados e fazer eco do que eu quero em um script.

O que preciso fazer agora é gravar o arquivo /tty/USB0 em um arquivo e, quando invoco meu script, quero que ele faça um eco min / max / avg para determinados campos delimitados por vírgulas.

Código existente: Saídas de dados da estação meteorológica para um arquivo temporário e, em seguida, exibe esse arquivo na tela

#!/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

Eu quero fazer isso para $6 e $20 .

    
por Al Renner 07.07.2015 / 01:38

1 resposta

0

Você pode começar com o registro de data e hora dos dados à medida que você os recebe em um arquivo de log:

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

Você pode escolher um formato que seja fácil de analisar. Claro, os dados podem já ter um registro de data e hora. O texto acima fornece linhas com data e hora de início fixo, por exemplo:

2015.07.07.093953

Em um script, você pode examinar os dados e extrair as entradas que lhe interessam. Por exemplo para média / max nas últimas 24 horas use em seu script de shell:

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

Isso obtém o carimbo de data e hora por 24 horas no mesmo formato. Você pode, então, obter o máximo e a média:

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 }
'

Observe que há um campo extra no início da linha e você precisa de $ 7 agora para o campo $ 6. Ao escolher um formato de data de largura fixa com o primeiro ano e os últimos segundos, podemos fazer uma comparação de cadeia simples entre as datas.

    
por 07.07.2015 / 09:57