awk를 사용하여 마지막 n 게임의 평균을 계산합니다.

awk를 사용하여 마지막 n 게임의 평균을 계산합니다.

내 파일이 점점 커지고 있습니다. 그 동안 내 지원 과정에 대한 로그를 작성할 것입니다. 해당 파일에는 아래와 같이 "Speed" 로그가 있습니다.

(some text)
speed= 1x
(some text)
speed= 1x
(some text)
speed= 1x
(some text)
speed= 0.9x
..
..
(some text)
speed= 0.8x
(some text)

평균 속도를 얻기 위해 아래 코드를 시도했습니다.

 awk '/speed/ {gsub("x","");print $2}' $PROCESS_LOG_FILE | awk -F : '{sum+=$1} END {print sum/NR}'

최근 120개 항목의 평균을 얻을 수 있습니까? grep과 tail을 사용해 보았지만 파일이 계속 늘어나서 시간이 오래 걸립니다.

답변1

다소 무리가 있을 수도 있지만 tac임시 lseek파일을 통해 필요한 시점을 정의하고 120 속도에 도달할 때까지 거기에서 거꾸로 작업합니다.

tac file | awk '/speed/ {SUM += $2; if (++C == 120) {print SUM/C; exit}}'

또는 패턴이 120회 미만으로 발생할 수 있는 입력을 처리합니다.

tac file | awk '/speed/ {SUM += $2; if (++C == 120) exit}
                END {if (C) print SUM/C}'

답변2

이를 위해 awk 대신 perl을 사용하겠습니다. 지난 120개 속도를 아주 간단하게 기억해 보세요.

perl -MList::Util=sum -nE '
    if (/speed= ([\d.]+)/) {@speeds = ($1, @speeds)[0..119]} 
    # could also write:
    #   if (/speed= ([\d.]+)/) {push @speeds, $1; shift @speeds if @speeds > 120}

    END {say @speeds == 0 ? "No matches" : sum(@speeds)/@speeds}
' speed.log

답변3

원형 테이블을 사용해야 합니다. 다음은 마지막 5개 값이 포함된 샘플 코드입니다.

BEGIN { maxi=5 ; c=0 ; nb=0 ;  }
/^speed/ { list[nb++]=$2 ; nb=nb % maxi ;
   c++ ; if (c> maxi) c=maxi ;
   s=0 ;
   for(i=0;i<=c;i++) s+=list[i] ;
   printf "NR: %d, c=%d, s=%d AVG : %3.2f\n",NR,c,s,s/c ;
}

이를 샘플 파일(또는 명령줄에 값을 입력하여 명령줄)에서 테스트할 수 있습니다.

awk -f avg.awk sample.txt

그런 다음 5를 120으로 바꾸고 printf적절하게 배열하십시오.

후행 은 +=$2무시됩니다 x.

답변4

이것이 당신에게 효과가 있습니까?

grep speed test | tail -n 120 | cut -d " " -f 2 | cut -d "x" -f 1 | awk -F : '{sum+=$1} END {print sum/NR}'

나는 단지 여러분의 입력을 이라는 파일에 넣고 test그 파일을 실행하겠습니다. 산출:

0.94

하지만 대용량 파일의 성능을 판단하는 것은 불가능합니다.

관련 정보