Время извлечения между событиями от файла журнала в Bash

У меня есть файл /tmp/log/1GPS_garmin2.log и я хочу вычислить, сколько время передало между первой и последней остановкой механизма.

Вот образец данных:

181225.249849952:,06,,14,18,19,22,27,32,,,2.0,1.4,1.5*34
181225.254218266:$GPVTG,000.0,T,355.7,M,000.01,N,**0000**.02,K*79
181225.259072464:$GPRMC,161212.2,A,4653.89701,N,01940.55676,E,000.01,000.0,100913,004.3,E*59
181225.264592889:$GPGGA,**161212**.2,4653.89701,N,01940.55676,E,2,08,1.4,124.2,M,41.3,M,,*5C
181225.268283132:$GPGSA,A,3,,03,06,,14,18,19,22,27,32,,,2.0,1.4,1.5*34
181225.274272586:$GPVTG,000.0,T,355.7,M,000.01,N,0000.01,K*7A
181225.277401076:$GPRMC,161212.4,A,4653.89701,N,01940.55676,E,000.01,000.0,100913,004.3,E*5F
181225.280493945:$GPGGA,161212.4,4653.89701,N,01940.55676,E,2,08,1.4,124.2,M,41.3,M,,*5A
181225.283556186:$GPGSA,A,3,,03,06,,14,18,19,22,27,32,,,2.0,1.4,1.5*34
181225.286888004:$GPVTG,000.0,T,355.7,M,000.01,N,0000.01,K*7A
181225.290137581:$GPRMC,161212.6,A,4653.89701,N,01940.55677,E,000.01,000.0,100913,004.3,E*5C
181225.293265920:$GPGGA,161212.6,4653.89701,N,01940.55677,E,2,08,1.4,124.2,M,41.3,M,,*59
181225.297247457:$GPGSA,A,3,,03,06,,14,18,19,22,27,32,,,2.0,1.4,1.5*34
181225.300419979:$GPVTG,000.0,T,355.7,M,000.01,N,0000.02,K*79
181225.303577147:$GPRMC,161212.8,A,4653.89701,N,01940.55677,E,000.01,000.0,100913,004.3,E*52
181225.306632425:$GPGGA,161212.8,4653.89701,N,01940.55677,E,2,08,1.4,124.2,M,41.3,M,,*57
181225.310040084:$GPGSA,A,3,,03,06,,14,18,19,22,27,32,,,2.0,1.4,1.5*34
181225.313133946:$GPVTG,000.0,T,355.7,M,000.01,N,0000.01,K*7A
181225.317166965:$GPRMC,161213.0,A,4653.89701,N,01940.55677,E,000.01,000.0,100913,004.3,E*5B
181225.320426880:$GPGGA,161213.0,4653.89701,N,01940.55677,E,2,08,1.4,124.2,M,41.3,M,,*5E
181225.323792082:$GPGSA,A,3,,03,06,,14,18,19,22,27,32,,,2.0,1.4,1.5*34
181225.327003400:$GPVTG,000.0,T,355.7,M,000.01,N,0000.01,K*7A
181225.330192100:$GPRMC,161213.2,A,4653.89701,N,01940.55677,E,000.01,000.0,100913,004.3,E*59
181225.333141314:$GPGGA,161213.2,4653.89701,N,01940.55677,E,2,08,1.4,124.2,M,41.3,M,,*5C
181225.336206449:$GPGSA,A,3,,03,06,,14,18,19,22,27,32,,,2.0,1.4,1.5*34
181225.339610415:$GPVTG,000.0,T,355.7,M,000.01,N,0000.02,K*79
181225.342976480:$GPRMC,161213.4,A,4653.89701,N,01940.55678,E,000.01,000.0,100913,004.3,E*50
181225.346003737:$GPGGA,161213.4,4653.89701,N,01940.55678,E,2,08,1.4,124.2,M,41.3,M,,*55
181225.349040725:$GPGSA,A,3,,03,06,,14,18,19,22,27,32,,,2.0,1.4,1.5*34
181225.352282572:$GPVTG,000.0,T,355.7,M,000.01,N,0000.02,K*79
181225.355736225:$GPRMC,161213.6,A,4653.89700,N,01940.55678,E,000.01,000.0,100913,004.3,E*53
181225.359730217:$GPGGA,161213.6,4653.89700,N,01940.55678,E,2,08,1.4,124.2,M,41.3,M,,*56
181225.363299063:$GPGSA,A,3,,03,06,,14,18,19,22,27,32,,,2.0,1.4,1.5*34
181225.366588198:$GPVTG,000.0,T,355.7,M,000.01,N,0000.02,K*79
181225.371109954:$GPRMC,161213.8,A,4653.89700,N,01940.55678,E,000.01,000.0,100913,004.3,E*5D
181225.374346102:$GPGGA,161213.8,4653.89700,N,01940.55678,E,2,08,1.4,124.2,M,41.3,M,,*58
181225.377370616:$GPGSA,A,3,,03,06,,14,18,19,22,27,32,,,2.0,1.4,1.5*34
181225.380446435:$GPVTG,000.0,T,355.7,M,000.01,N,0000.02,K*79

$GPVTG строка содержит скорость механизма между двумя звездочками (звездочки не находятся в файле). $GPGGA строка содержит время, которое является также между двумя звездочками. Первые два символа являются часом, следующие два являются минутами, и последние два являются секундами.

Механизм останавливается, когда скорость 0000. Мне требуется время первой и последней остановки так, чтобы я мог изменить ее на секунды и выписать к log.txt.

Я могу убрать изменение и запись, но нуждаться в помощи для нахождения времен первых и последних остановок механизма.

Это - мой run.sh файл:

#!/bin/bash
fullfilename=$1
filename=$(basename "$fullfilename")
ext="${filename##*.}"

if [[ $# -ne 1 ]]; then
  echo "Error 1"
  exit 1
elif [[ $ext != "log" ]]; then
  echo "Error 2"
  exit 1
elif [[ ! -r $fullfilename ]]; then
  echo "Error 3"
  exit 1
else
  grep '$GPGGA' $1 > test1.txt
  grep '$GPVTG' $1 > test2.txt
  cut -c50-53 test2.txt > speed.txt
  cat speed.txt | wc -l > dealer.txt
  while read line
    do
      I=0; for N in $(cat speed.txt); do I=$(($I + 10#$N)); done;
      echo "average speed:" $(($I / $line)) >> log.txt
  done < dealer.txt
  grep '0000' speed.txt | wc -l > stop.txt
  while read stop
    do
      echo "number of stops:" $stop >> log.txt
  done < stop.txt
fi

Я уже вычислил среднюю скорость и количество остановок.

Примечание: Я - новичок в ударе, таким образом, мое решение не является лучшим для этой задачи, но я не хочу использовать awk все же, пока я не изучил другие утилиты удара.

0
задан 13 December 2017 в 02:22

2 ответа

Из вашего образца:

$ sed -nr '/0000/N;N; s/.*GPGGA,([^,]+).*/\1/p' file | sed -n '1p;$p'
161212.2
161213.8

Примечания

  • -n ничего не печатают, пока мы не попросим об этом
  • -r использовать ERE
  • /0000/N;N найдите строку с 0000 и прочитайте следующие две строки
  • s/old/new замените old на new
  • .* любые символы в строке
  • ([^,]+) сохраните некоторые символы, которые не являются , в этой позиции
  • \1 обратная ссылка на сохраненный шаблон
  • |, передавая вывести в другую sed (без изящества)
  • '1p;$p' напечатать строку 1 и напечатать последнюю строку

И, переведя в секунды, я оставляю вам ...

3
ответ дан 3 November 2019 в 09:25

Я использовал бы awk для чего-то вроде этого.

Идея состояла бы в том, чтобы разделить записи (строки) на разделенные от запятой поля, и затем:

  • если первое поле заканчивается в $GPVTG и восьмое поле запускается с 0000, затем установите булев флаг, чтобы указать, что механизм останавливается
  • когда первое поле заканчивается в $GPGGA и механизм останавливается, сохраните значение расстояния от второго поля
  • в конце распечатайте первые и последние значения расстояния

Так

#!/usr/bin/awk -f

function printsecs(s) { 
  print substr(s,5) + 60 * (substr(s,3,2) + 60 * substr(s,1,2));
}

BEGIN {FS=","}

$1 ~ /\$GPVTG$/ && $8 ~ /^0000/ {
  stopped = 1;
} 

$1 ~ /\$GPGGA$/ && stopped {
  t[++n] = $2; 
  stopped = 0; 
} 

END {
  printsecs(t[1]); printsecs(t[n]);
}
2
ответ дан 3 November 2019 в 09:25

Другие вопросы по тегам:

Похожие вопросы: