sed/awk를 사용하여 시차 계산

sed/awk를 사용하여 시차 계산

아래와 같이 과제 제출 날짜가 포함된 두 개의 열이 있습니다.

NAME  SUBMIT_TIME
Job1 Apr 25 11:30
Job2 Apr 25 16:30

현재 날짜/시간이 60분 이상 차이나는 경우 발생하는 알림이 필요합니다.

다른 열의 현재 날짜/시간과의 시차(분)를 계산하도록 도와주세요.

예를 들어, 현재 날짜/시간과의 시차를 나타내는 열이 필요합니다. 작업이 11시 30분에 실행되기 시작했고 지금은 13시 30분이므로 120분의 차이가 있어야 한다고 가정합니다.

답변1

지원되는 시간 버전이 awk유효하고 누락된 연도 정보가 현재 연도라고 가정하면 다음을 수행할 수 있습니다.

$ awk -F'[ :]' 'BEGIN{nowtime=systime();
                      mths="JanFebMarAprMayJunJulAugSepOctNovDec";
                     } 
                /[Jj]ob/ {$2=(match(mths,$2)+2)/3; 
                          jobtime=mktime(2022" "$2" "$3" "$4" "$5" "0, 1);
                          print (nowtime-jobtime)/60;
                         }
             ' datafile

누락된 연도를 하드코딩하는 이 솔루션이 연도 변경 사항(댓글에 있는 쿼리에 따라)이 올바르게 다루어지지 않아 만족스럽지 못한 경우, 연도 형식을 포함하도록 작업 제출 날짜가 포함된 데이터 파일의 형식을 변경하는 것이 좋습니다. YYYY.

참고:
Awk에 GNU 버전의 시간 기능이 탑재되어 있으면 시간 증분을 계산할 때 정규화됩니다. 즉, 월이나 연도를 변경할 때 윤년뿐만 아니라 다양한 길이의 월도 고려한다는 의미입니다. 이를 위해서는 다음을 포함하는 날짜 스탬프가 찍힌 작업 제출 데이터 파일이 필요합니다.연도정보첫 번째.

편집하다:
OP가 추가 열에 열 형식 출력을 요청했으며 시간은 분 단위로 증가했습니다. 수정된 코드는 다음과 같습니다:

$ awk -F'[ :]' 'BEGIN{nowtime=systime(); mths="JanFebMarAprMayJunJulAugSepOctNovDec";} 
                NR==1 {printf "%s  %s\n",$0,"DELTA(min)"}
                /[Jj]ob/ {mo=(match(mths,$2)+2)/3;
                          jobtime=mktime(2022" "mo" "$3" "$4" "$5" "0, 1); 
                          printf "%s %-4.1f\n",$0,(nowtime-jobtime)/60;
                         }
              ' datafile

NAME  SUBMIT_TIME  DELTA(min)                                       
Job1 Apr 25 11:30 410.2                                       
Job2 Apr 25 16:30 110.2

delta제공된 샘플 데이터 파일과 (내) 시스템 시간에는 시차( ) 숫자가 적용됩니다.

편집하다: @EdMorton의 제안에 따라 호스트 TZ 설정이 UTC 타임스탬프에 해당한다고 가정하고
UTC TZ 플래그를 함수의 두 번째 매개 변수 1로 코드에 통합했습니다.mktime()

관련 정보