最後の5分間のデータを取得して列を追加し、失敗した出力に番号を付けます。

最後の5分間のデータを取得して列を追加し、失敗した出力に番号を付けます。

次の結果を得るには専門家のアドバイスが必要です

入力する

2020-01-09 15:39:39,sharm,07296,97  
2020-01-09 15:40:40,SRI,6657,197  
2020-01-09 15:42:40,rinku,null,0  
2020-01-09 15:42:40,SVRMO,8588,39  
2020-01-09 15:44:58,MASTA,093720,48  

ここから最後の5分間のデータを取得します。 15:45にコマンドが実行されたと仮定すると(15:40〜15:45)のデータを選択する必要があります。

2020-01-09 15:40:40,SRI,6657,197  
2020-01-09 15:42:40,rinku,null,0  
2020-01-09 15:42:40,SVRMO,8588,39  
2020-01-09 15:44:58,MASTA,093720,48

出力は

284,4,3   

どこ

  • 284は、データの最後の行(197 + 0 + 39 + 48)の合計を表示します。
  • 4過去5分間のデータの総数を表示します。
  • 3最後の列の値がゼロ以外のデータの総数を表示します(たとえば、それぞれ197、39、48の1行、3行、4行)。

答え1

以下のコマンドはawk最初に現在と過去5分の日付を取得し、それをエポック時間(Unix Time) と設定開始時間そして時間の最大次に、読み取った各行について、最初のフィールド日付列をepochに変換し、時間がstartTimeとendTimeの間にあることを確認し、必要な計算を実行します。では、END最後の値sumと計算された変数をtotal印刷します。nonZero

awk -vstartTime="$(date -d'-5 minutes' '+%s')" \
    -vendTime="$(date '+%s')" \
    -F, '{ epoch="date -d\"" $1 "\" +%s"; epoch |getline timestamp; }
         (timestamp>=startTime && timestamp<=endTime){ sum+=$NF; total++; if($NF!=0)nonZero++ }
END{ print sum, total, nonZero }' OFS=, infile

与えられたテストデータを手動でテストします。

awk -vstartTime=1578571800 \
    -vendTime=1578572100 \
    -F, '{ epoch="date -d\"" $1 "\" +%s"; epoch |getline timestamp; }
         (timestamp>=startTime && timestamp<=endTime){ sum+=$NF; total++; if($NF!=0)nonZero++ }
END{ print sum, total, nonZero }' OFS=, infile

関連情報