次のログエントリが前のログエントリより1分以上遅れて発生した回数を計算します。

次のログエントリが前のログエントリより1分以上遅れて発生した回数を計算します。

日付、時刻(時、分、秒、ミリ秒)、車速、車と私たちの車の前後の車との間の自由距離を記録するログファイルがあります。車両が停止している場合は距離を測定しません。

私のselfdriving.logファイルは次のとおりです。

2021.04.01. 13:14:30:78 78 110 110
2021.04.01. 13:14:30:99 79 111 111
2021.04.01. 13:14:31:50 80 111 119
2021.04.01. 13:14:59:87 87 118 117
2021.04.01. 13:16:59:87 86 116 119
2021.04.01. 13:17:22:32 75 117 115
2021.04.01. 13:18:50:65 75 96 109
2021.04.01. 13:18:55:00 0 0 0

私が望むのは、最後のログエントリから1分以上後にログエントリが生成された回数を返すスクリプトを書くことです。したがって、私の計算が正しい場合は、2この場合に返す必要があります。grepどのように機能し、戻り値を変数に入れるのかわかりません。これまで私は次のことを試しました。

#!/bin/sh

for i in "cat selfdriving.log"
do
  grep (([01][0-9])|(2[0-3])):[0-5][0-9]:[0-5][0-9]:[0-9][0-9]
done

私の知る限り、評価は高くありません。

答え1

時間を比較する必要がある問題の解決策は、日付/時刻を整数秒に変換することです。その後、前のレコードのタイムスタンプを覚えておくと、操作を実行して60秒より大きな違いを見つけることができます。

GNU awkは一部の組み込み時間関数

gawk -F'[. :]+' '
    {timestamp = mktime($1" "$2" "$3" "$4" "$5" "$6)}
    NR == 1 {prev = timestamp}
    timestamp - prev >= 60 {print}
    {prev = timestamp}
' selfdriving.log
2021.04.01. 13:16:59:87 86 116 119
2021.04.01. 13:18:50:65 75 96 109

可能なレコード数を取得するには

  1. 出力をパイプして| wc -l数を取得する
  2. awkで計算を実行し、結果をENDブロックに印刷します。

関連情報