awk управляют в то время как ((getline <“gpsoutput.tr”)> 0 для того, чтобы постоянно обновить содержание файла

Я в настоящее время использую 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"; (единственный > вместо >>) но не работал на меня.

3
задан 24 February 2017 в 19:49

2 ответа

Проблема действительно, что объяснил @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
2
ответ дан 1 December 2019 в 17:04

Если файл данных 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.
}
0
ответ дан 1 December 2019 в 17:04

Другие вопросы по тегам:

Похожие вопросы: