마지막 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 마지막 열 값이 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

관련 정보