我目前正在使用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;')但不适用于我。
答案 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