次の結果を得るには専門家のアドバイスが必要です
入力する
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