我有一个公交车队,每天早上都会给我发送一份有关前一天车辆状况的监控日志文件。日志每 5 分钟更新一次各种信息。收集的数据包括 GPS 坐标。
经度和纬度用不同的行表示。每辆车的日志都存储在一个单独的文件夹中。此文件夹中有一个包含所有日志文件的子文件夹。每个日志文件都以“监控”开头,然后是创建日期和时间。所以我在这个文件夹中每天都有一个日志文件。
文件示例:
07-15 15:48:28.064 [INFO ] dataset.up.throughput : 0
07-15 15:53:16.425 [INFO ] system.disk.used.total : 731 MB
07-15 15:53:16.426 [INFO ] system.mem.used.total : 458 MB
07-15 15:53:16.427 [INFO ] system.cpu.usage : 9,99
07-15 15:53:16.520 [INFO ] msg.nbr.expired : 0
07-15 15:53:16.521 [INFO ] msg.nbr.received : 0
07-15 15:53:16.522 [INFO ] msg.send.throughput : 0
07-15 15:53:16.523 [INFO ] msg.received.throughput : 0
07-15 15:53:16.590 [INFO ] dataset.nbr.jobs.queue : 6
07-15 15:53:16.590 [INFO ] dataset.nbr.jobs.inprogress : 6
07-15 15:53:16.590 [INFO ] dataset.nbr.jobs.expired : 0
07-15 15:53:16.590 [INFO ] dataset.down.throughput : 0
07-15 15:53:16.590 [INFO ] dataset.up.throughput : 0
07-15 15:53:16.591 [INFO ] posn.altitude : 80.0 m
07-15 15:53:16.591 [INFO ] posn.longitude : 4° 18' 34"
07-15 15:53:16.591 [INFO ] posn.latitude : 50° 53' 35"
07-15 15:53:16.591 [INFO ] posn.speed : 23.55 m/s
07-15 15:53:16.591 [INFO ] posn.track : 235° 1' 30"
07-15 15:53:16.591 [INFO ] posn.source : GPS_DR
07-15 15:53:16.591 [INFO ] posn.timestamp : Wed Jul 15 13:53:15 CEST 2015
07-15 15:53:16.592 [INFO ] mpm.online : false
07-15 15:53:16.592 [INFO ] mpm.online.ts : 0
07-15 15:58:16.383 [INFO ] system.disk.used.total : 732 MB
通常我使用这样的 shell 命令:
find /path/to /vehicle/folder/vehicleID/ -type d -name 'FolerContainingLogFiles' -exec sh -c "ls {}/monitoring* -t | head -1 | grep "posn.l" {}/monitoring* | tail -2" >> /path/results.log ";" ;
在正常情况下,这种方法很有效,但有时公交车在停车场上只移动了很短的时间。在这种情况下,GPS 无法与卫星同步,因此记录会给我value = "0"
经度和纬度。
问题就在这里:
- 如果最后一个坐标为“0”,那么我需要进入文件并尝试找到最后一个非零值。
- 有时,文件只有零值。在这种情况下,我需要转到上一个文件并开始寻找非零值,依此类推。
我尝试编写一个 bash 脚本,但由于某种原因无法获得正确的输出。
find $zoekPad -type d -name 'mobiguider-logs-archive' | while read line; do
cmdOutputLon=$(ls $line/monitoring* -t | head -1 | grep "posn.lo" $line/monitoring* | tail -1 )
lonDD=$(echo $cmdOutputLon | awk -F':' '{print $5}' | awk '{printf ("%.8f\n",$1+$2/60+$3/3600)}')
cmdOutputLon=$cmdOutputLon";"$lonDD
cmdOutputLat=$(ls $line/monitoring* -t | grep "posn.la" $line/monitoring* | tail -1)
latDD=$(echo $cmdOutputLat | awk -F':' '{print $5}' | awk '{printf ("%.8f\n",$1+$2/60+$3/3600)}')
cmdOutputLat=$cmdOutputLat";"$latDD
huidigeIndexStart=1
while [[ true ]]
do
loopCount=1000
cmdOutputLon=$(ls $line/monitoring* -t | grep "posn.lo" $line/monitoring* | sed -n $huidigeIndexStart,$huidigeIndexStart"p")
echo $huidigeIndexStart
lonDD=$(echo $cmdOutputLon | awk -F':' '{print $5}' | awk '{printf ("%.8f\n",$1+$2/60+$3/3600)}')
cmdOutputLon=$cmdOutputLon";"$lonDD
cmdOutputLat=$(ls $line/monitoring* -t | grep "posn.la" $line/monitoring* | sed -n $huidigeIndexStart,$huidigeIndexStart"p")
latDD=$(echo $cmdOutputLat | awk -F':' '{print $5}' | awk '{printf ("%.8f\n",$1+$2/60+$3/3600)}')
cmdOutputLat=$cmdOutputLat";"$latDD
if ! [[ $cmdOutputLon =~ '0° 0'\'' 0"' ]]
then
echo $cmdOutputLon >> $schrijfPad
echo $cmdOutputLat >> $schrijfPad
continue 2
fi
if [ $huidigeIndexStart -gt $loopCount ] && [ $loopCount -gt 0 ]
then
echo $cmdOutputLon >> $schrijfPad
echo $cmdOutputLat >> $schrijfPad
continue 2
fi
huidigeIndexStart=$(($huidigeIndexStart + 1))
done
echo $cmdOutputLon >> $schrijfPad
echo $cmdOutputLat >> $schrijfPad
done
now=$(date +"%m_%d_%Y_%H:%M:%S");
echo $now
echo "Einde LastGPS_allvehicules.sh "$now >> /home/mxtbp/raid5/logs/rsync/Rsync_log.txt ;
有人可以帮忙吗?