数据列内范围的最大值、平均值、最小值

数据列内范围的最大值、平均值、最小值

我的数据结构如下:-

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

请注意 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
$

相关内容