Я в настоящее время использую G-ЗВЕЗДУ IV globalsat GPS, который дает мне следующий вывод (который прибывает из GPS каждая 1 секунда), и я сохраняю этот вывод путем перенаправления к имени файла "gpsoutput.tr". Этот файл постоянно обновляется каждый раз, когда он получает сигнал GPS. Содержание этого файла следующие:
$GPGSV,3,2,10,14,43,184,,27,33,314,,29,21,152,,16,17,263,*7D
$GPGSV,3,3,10,24,10,092,,19,06,322,*79
$GPRMC,095827.000,A,2335.2440,N,05809.8432,E,0.55,103.38,091114,,,A*66
$GPGGA,095828.000,2335.2443,N,05809.8433,E,1,04,5.2,89.5,M,-34.7,M,,0000*46
$GPGSA,A,3,21,22,18,15,,,,,,,,,6.4,5.2,3.6*3C
$GPRMC,095828.000,A,2335.2443,N,05809.8433,E,1.21,102.44,091114,,,A*63
$GPGGA,095829.000,2335.2446,N,05809.8434,E,1,04,5.2,89.5,M,-34.7,M,,0000*45
$GPGSA,A,3,21,22,18,15,,,,,,,,,6.4,5.2,3.6*3C
$GPRMC,095829.000,A,2335.2446,N,05809.8434,E,0.92,102.44,091114,,,A*69
$GPGGA,095830.000,2335.2448,N,05809.8437,E,1,04,5.2,89.5,M,-34.7,M,,0000*40
$GPGSA,A,3,21,22,18,15,,,,,,,,,6.4,5.2,3.6*3C
$GPRMC,095830.000,A,2335.2448,N,05809.8437,E,1.25,102.12,091114,,,A*62
$GPGGA,095831.000,2335.2450,N,05809.8441,E,1,04,5.2,89.5,M,-34.7,M,,0000*49
$GPGSA,A,3,21,22,18,15,,,,,,,,,6.4,5.2,3.6*3C
$GPRMC,095831.000,A,2335.2450,N,05809.8441,E,1.47,101.80,091114,,,A*67
$GPGGA,095832.000,2335.2455,N,05809.8446,E,1,04,5.2,89.5,M,-34.7,M,,0000*48
$GPGSA,A,3,21,22,18,15,,,,,,,,,6.4,5.2,3.6*3C
$GPGSV,3,1,10,21,55,052,18,22,54,297,14,18,53,011,22,15,18,042,18*72
$GPGSV,3,2,10,14,43,184,,27,33,314,,29,21,152,,16,17,263,*7D
$GPGSV,3,3,10,24,10,092,,19,06,322,*79
$GPRMC,095832.000,A,2335.2455,N,05809.8446,E,2.36,100.07,091114,,,A*6D
этот файл ("gpsoutput.tr") продолжает добавляться с новыми строками каждый раз, когда он получает сигнал GPS.
Теперь, у меня есть файл удара, который запускает awk программу непрерывно к извлечениям (скорость), (широта, долгота) и (метка времени UTC) в трех различных файлах. Это - сценарий удара:
#!/bin/sh
echo "Starting GPS info gathering"
while true; do
awk -F, -f gpsgetinfo.awk gpsoutput.tr
done
Наконец, моя awk программа очень проста, который я хочу, чтобы она постоянно считала последнюю запись из gpsoutput.tr файла, и вышеупомянутое извлечения упомянуло infos в трех отдельных файлах. awk программа (gpsgetinfo.awk) следующие:
BEGIN {
FS = ",";
OFS = " ";
while ((getline < "gpsoutput.tr") > 0) {
if($1=="$GPRMC") {
converted = $8*1.852;
printf $4 " " $6 "\n" >> "data1.txt";
printf "%.3f \n", converted >> "speed.txt";
printf $2 "\n" >> "gpstime.txt";
}
}
}
END {
fflush();
}
Проблема, это в моих выходных файлах (data1.txt
, speed.txt
и gpstime.txt
) от awk
программа, тот же вывод повторяется несколько раз и в течение нескольких секунд, размер файла достигает к размеру Мега байтов. Прояснить. Это - то, как мой выходной файл времени UTC смотрит:
095546.000
095547.000
095546.000
095547.000
095546.000
095547.000
095546.000
095547.000
095546.000
095547.000
095546.000
095547.000
095546.000
и это повторяется для нескольких 100 раз в файле.
В то время как ожидаемый вывод в gpstime.tr должен просто быть:
095546.000
095547.000
095548.000
095549.000
095550.000
095551.000
и так далее.. так как сигнал GPS получен каждая 1 секунда.
gpsoutput.tr
файл, где nmea данные сохраняются, является всего несколькими kbs, и без любых повторений в данных.
Может любой говорить мне. почему выходные файлы имеют столько повторных значений? Я также попытался использовать printf $4 " " $6 "\n" > "data1.txt";
(единственный >
вместо >>
) но не работал на меня.
Проблема действительно, что объяснил @Lekensteyn. Так как Ваш файл постоянно растет, Ваш awk
будет всегда повторять строки, которые он уже обработал. К сожалению, использование tail -f
не является решением, так как это продолжится навсегда, и awk ничего не распечатает.
Вместо этого используйте тот же сценарий, как предложено @Lekensteyn, но с >
вместо >>
:
#!/usr/bin/awk -f
BEGIN {
FS = ",";
}
$1 == "$GPRMC" {
converted = $8*1.852;
print $4, $6 > "data1.txt";
printf "%.3f \n", converted > "speed.txt";
print $2 > "gpstime.txt";
}
Вы тогда выполняете тот сценарий каждую секунду для воссоздавания выходных файлов:
#!/bin/sh
echo "Starting GPS info gathering"
while true; do
./gpsgetinfo.awk gpsoutput.tr
done
Если файл данных GPS только вырастет вместо перезаписанного, то Вы запишете те же данные много раз, именно поэтому Вы получаете дубликаты.
необходимо так или иначе продолжать подавать новые строки к awk. Это может быть сделано с помощью tail --follow
:
tail -f gpsoutput.tr | ./gpsoutput.awk
Ваш gpsoutput.awk
должен тогда быть этот исполняемый сценарий:
#!/usr/bin/awk -f
BEGIN {
FS = ",";
}
$1 == "$GPRMC" {
converted = $8*1.852;
print $4, $6 >> "data1.txt";
printf "%.3f \n", converted >> "speed.txt";
print $2 >> "gpstime.txt";
# Optional: add fflush() here.
}