데이터 열 내 범위의 최대값, 평균값, 최소값

데이터 열 내 범위의 최대값, 평균값, 최소값

내 데이터 구조는 다음과 같습니다.

X   43808873    A   14
X   43808874    G   7
X   43808875    T   15
X   43808876    A   13
X   43808877    T   4
X   43808878    C   13
X   43808879    T   11
X   43808880    C   8
X   43808881    T   3
X   43808882    C   14
X   43808883    T   15
X   43808884    C   15

4열의 최대값, 최소값 및 평균을 계산할 수 있기를 원하지만 특정 범위(예: 43808877-43808882) 내에서만 가능합니다.

이 awk 코드가 있지만 특정 범위에 대해 수정하는 방법을 모르겠습니다. 어떤 제안이라도 주시면 감사하겠습니다.

awk 'NR == 1 { min = $4; max = $4 }
   {
    sum += $4
    if ($4 > max) {
        max = $4
    }
    if ($4 < min) {
        min = $4
    }
   } END {
    print max
    print min
    print sum / NR
   }' file

답변1

일방 통행:

sort -k4n,4 file | awk '$2>=43808877 && $2<=43808882{tot+=$4;cnt++;max=$4;min=cnt==1?$4:min}END{print min, max,tot/cnt}'

먼저 sort첫 번째 레코드가 최소값을 갖고 마지막 레코드가 최대값을 갖도록 파일을 4열에 배치합니다. 를 사용하여 awk범위의 숫자를 합산하고 통계를 인쇄합니다.

답변2

awk를 좋아하지 않는다면 Miller는 이런 종류의 작업에 적합합니다.

mlr --nidx --repifs filter '$2 >= 43808877 && $2 <= 43808882' then stats1 -f 4 -a max,min,mean file

답변3

$ cat tst.awk
$2>=43808877 && $2<=43808882 {
    cnt++
    sum += $4
    min = ( (cnt == 1) || ($4 < min) ? $4 : min )
    max = ( (cnt == 1) || ($4 > max) ? $4 : max )
}
END {
    print max+0
    print min+0
    print (cnt ? sum / cnt : 0)
}

$ awk -f tst.awk file
14
3
8.83333

원하는 범위 내에 레코드가 없더라도 항상 숫자 출력을 얻고 0으로 나누기 오류가 발생하지 않도록 END 섹션의 가드에 유의하십시오.

답변4

라이트 버전.

$ awk '/43808877/,/43808882/{t+=$4;c++;if($4>x){x=$4}if($4<n||!length(n)){n=$4}}END{print x,n,t/c}' f
14 3 8.83333
$

관련 정보