【问题标题】:awk command while ((getline < "gpsoutput.tr") > 0 for constantly updating file contentsawk 命令 while ((getline < "gpsoutput.tr") > 0 用于不断更新文件内容
【发布时间】:2015-01-05 18:58:26
【问题描述】:

我目前正在使用 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" > "data1.txt"; (单个“>”而不是“>>”)但对我不起作用。

【问题讨论】:

  • 你为什么使用getline ??
  • 因为我希望它不断读取从 GPS 接收到的最新数据。您还有其他命令可以建议吗?
  • 默认情况下 awk 不这样做吗?尝试不使用 while 循环
  • 不.. 我试过这样做.. 不幸的是,awk 仅适用于静态输入数据.. 我的 gps 输出文件不断更新。 tthe awk 程序在它上面不起作用
  • 您获得了更多的输出,因为默认情况下 awk 从输入文件中逐行读取。除此之外,getline 会导致从输入文件中读取一行,使预期输出加倍。简而言之,我不确定 awk 是否是您想要用于此目的的东西

标签: bash awk getline nmea


【解决方案1】:

解决此问题的方法取决于您使用的 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。我上面使用的重定向可能不适合您的应用程序。

呆呆

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

麻木

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    相关资源
    最近更新 更多