내 장치에 기상 관측소가 연결되어 있는데 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가 필요합니다. 연도가 첫 번째이고 마지막이 초인 고정 너비 날짜 형식을 선택하면 날짜 간 간단한 문자열 비교를 수행할 수 있습니다.