
다음 결과를 얻으려면 전문가의 조언이 필요합니다
입력하다
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 마지막 열 값이 0이 아닌 전체 데이터 수를 표시합니다(예: 값이 각각 197, 39, 48인 1, 3, 4행).
답변1
아래 명령은 awk
먼저 현재 및 지난 5분 날짜를 가져와 이를 에포크 시간(유닉스 시간) 그리고 설정시작 시간그리고시간의 최대그런 다음 읽은 각 행에 대해 첫 번째 필드 날짜 열을 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