awk comando while ((getline “gpsoutput.tr”) 0 para atualizar constantemente o conteúdo do arquivo

3

Atualmente, estou usando um GPS globalsat G-STAR IV que me fornece a seguinte saída (que vem do GPS a cada 1 segundo) e salvo essa saída redirecionando para um nome de arquivo "gpsoutput.tr". Este arquivo é constantemente atualizado cada vez que recebe um sinal de GPS. O conteúdo deste arquivo é o seguinte:

$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

esse arquivo ("gpsoutput.tr") continua sendo adicionado com novas linhas cada vez que recebe um sinal de GPS.

Agora, eu tenho um arquivo bash que executa um programa awk continuamente para extrair a (velocidade), a (latitude, longitude) e a (data e hora UTC) em três arquivos diferentes. Este é o script bash:

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

 done

Finalmente, meu programa awk é muito simples, e eu quero que ele leia constantemente o último registro do arquivo gpsoutput.tr e extraia as informações acima mencionadas, nos três arquivos separados. o programa awk (gpsgetinfo.awk) é o seguinte:

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();
}

O problema é que em meus arquivos de saída ( data1.txt , speed.txt e gpstime.txt ) do programa awk , a mesma saída está repetindo várias vezes e em poucos segundos, o tamanho do arquivo está atingindo para o tamanho de mega bytes. Para deixar claro. É assim que meu arquivo de saída de hora do utc parece:

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

e se repete por várias vezes 100 no arquivo.

Enquanto a saída esperada no gpstime.tr deve ser apenas:

095546.000
095547.000
095548.000
095549.000
095550.000
095551.000

e assim por diante .. desde que o sinal GPS é recebido a cada 1 segundo.

O arquivo gpsoutput.tr no qual os dados nmea estão sendo salvos, é de apenas alguns kbs e sem nenhuma recorrência nos dados.

Alguém pode me dizer. Por que os arquivos de saída estão tendo tantos valores repetidos? Eu também tentei usar printf $4 " " $6 "\n" > "data1.txt"; (único > em vez de >> ) mas não funcionou para mim.

    
por Shezwan91 09.11.2014 / 13:23

2 respostas

2

O problema é de fato o que @Lekensteyn explicou. Como seu arquivo está em constante crescimento, seu awk sempre repetirá as linhas já processadas. Infelizmente, usar tail -f não é uma solução, já que isso vai durar para sempre e o awk não imprimirá nada.

Em vez disso, use o mesmo script sugerido por @Lekensteyn, mas com > em vez de >> :

#!/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";
}

Você então executa esse script a cada segundo para recriar seus arquivos de saída:

#!/bin/sh
echo "Starting GPS info gathering"
while true; do
    ./gpsgetinfo.awk gpsoutput.tr    
 done
    
por terdon 09.11.2014 / 14:28
0

Se o arquivo de dados GPS crescer apenas em vez de sobrescrito, você escreverá os mesmos dados várias vezes, e é por isso que obtém duplicatas.

Você deve, de alguma forma, continuar alimentando novas linhas com o awk. Isso pode ser feito usando tail --follow :

tail -f gpsoutput.tr | ./gpsoutput.awk

Seu gpsoutput.awk deve ser este script executável:

#!/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.
}
    
por Lekensteyn 09.11.2014 / 13:34