awk命令while((getline<" gpsoutput.tr")> 0用于不断更新文件内容

时间:2014-11-09 10:58:29

标签: bash awk getline nmea

我目前正在使用G-STAR IV globalsat GPS,它给我以下输出(每1秒来自GPS)我通过重定向到文件名“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();
}

问题是,在awk程序的输出文件(data1.txt,speed.txt和gpstime.txt)中,相同的输出重复几次,并在几秒钟内,文件大小达到兆字节的大小。说清楚。这是我的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
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

等等..因为每1秒接收一次gps信号。

保存nmea数据的gpsoutput.tr文件只有几kbs,而且没有任何数据重现。

任何人都可以告诉我。为什么输出文件有这么多重复值?我也尝试过使用printf $ 4“”$ 6“\ n”&gt; “DATA1.TXT”; (单个'&gt;'而不是'&gt;&gt;')但不适用于我。

1 个答案:

答案 0 :(得分:0)

解决此问题的方法取决于您使用的awk版本。首先,简化您的awk程序。

# gpsgetinfo.awk
BEGIN {
    FS = ","; 
    OFS = " ";
}
$1=="$GPRMC" {
    printf $4 " " $6 "\n" > "data1.txt"
    printf "%.3f \n", converted > "speed.txt"
    printf $2 "\n" > "gpstime.txt"

    fflush("")
}

awk程序中的重定向与shell中的重定向略有不同。您确实需要read the docs。我上面使用的重定向可能不适合您的应用程序。

<强> GAWK

$ tail -f gpsoutput.tr | awk -f gpsgetinfo.awk

<强> mawk

在我自己的系统上,我使用mawk的完整路径。

$ tail -f gpsoutput.tr | /usr/bin/mawk -W interactive -f gpsgetinfo.awk