awk command while ((getline & lt; & ldquo; gpsoutput.tr & rdquo;) & gt; 0 для постоянного обновления содержимого файла

В настоящее время я использую GPS-навигатор G-STAR IV globalsat, который дает мне следующий результат (который поступает от 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.

Теперь , У меня есть файл bash, который постоянно запускает awk-программу, чтобы извлекать (скорость), (широту, долготу) и (временную метку UTC) в трех разных файлах. Это скрипт bash:

#!/bin/sh
echo "Starting GPS info gathering"
while true; do
    awk -F, -f gpsgetinfo.awk gpsoutput.tr

 done

Наконец, моя awk-программа очень проста, и я хочу, чтобы она постоянно читала последнюю запись из файла gpsoutput.tr и извлекала вышеупомянутую информацию в трех отдельные файлы. 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

, и он повторяется несколько раз в файле.

Пока ожидаемый вывод в gpstime.tr должен быть просто:

095546.000
095547.000
095548.000
095549.000
095550.000
095551.000

и т. д., поскольку сигнал gps принимается каждые 1 секунду.

Файл gpsoutput.tr, в котором сохраняются данные nmea, составляет всего несколько килобайт , и без каких-либо повторений в данных.

Может ли кто-нибудь сказать мне. почему выходные файлы имеют так много повторяющихся значений? Я также попытался использовать printf $4 " " $6 "\n" > "data1.txt"; (один > вместо >>), но не работал для меня.

1
задан 24 February 2017 в 20:49

1 ответ

Если файл данных 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
ответ дан 24 May 2018 в 02:02
  • 1
    Я попытался запустить выше. Но выходные файлы (gpstime.txt, data1.txt и т. Д.) Пусты. никакие данные в них вообще не сохраняются. – Shezwan91 9 November 2014 в 16:49

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

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