Unix 从文本文件中删除异常值

Unix 从文本文件中删除异常值,unix,awk,statistics,Unix,Awk,Statistics,我需要在Linux中检测并删除文本文件中的异常值,也许使用某种标准偏差 vals.txt 57 60.95 61 66.80 74.42 <--- OUTLIER/BAD DATA 57 60.95 61 66.80 74.42你的问题相当模糊,因此我将假设一个异常值是总体平均值的一个以上标准偏差(也不包括57),并且所有非异常值的平均值是你最后想要的 (以下用于进行数字运算,因为我不想查找(总体)标准偏差公式并用awk计算) $awk'NR==FNR{low=$1-$2;high=$1

我需要在Linux中检测并删除文本文件中的异常值,也许使用某种标准偏差

vals.txt

57
60.95
61
66.80
74.42 <--- OUTLIER/BAD DATA
57
60.95
61
66.80

74.42你的问题相当模糊,因此我将假设一个异常值是总体平均值的一个以上标准偏差(也不包括57),并且所有非异常值的平均值是你最后想要的

(以下用于进行数字运算,因为我不想查找(总体)标准偏差公式并用awk计算)

$awk'NR==FNR{low=$1-$2;high=$1+$2;next}

$1>=低&&$1您的问题非常模糊,因此我将假设一个异常值是总体平均值的一个以上标准偏差(也不包括57),并且所有非异常值的平均值是您最后想要的

(以下用于进行数字运算,因为我不想查找(总体)标准偏差公式并用awk计算)

$awk'NR==FNR{low=$1-$2;high=$1+$2;next}

$1>=低和$1为什么74.42是异常值而57不是?
grep-v异常值文件
应该解决当前信息的问题。为什么74.42是异常值而57不是?
grep-v异常值文件
应该解决当前信息的问题。
awk '{
cnt[$1]++
val[$1] = (val[$1] ? val[$1] "," $1 : $1)
sum[$1] += $1
    } END {
for (i in val) {
    n = split(val[i], a, " ")
    for (k=1; k<=n; k++)
        if (!((sqrt((a[k] - (sum[i]/cnt[i]))^2)) < ((sum[i] / cnt[i]) * (30/100)))) {
            cnt[i]--
            sum[i] -= val[i]
        }
}
for (i in sum)
    printf "%8.5f   %6.2f   %6d   %6.3f\n", i, sum[i], cnt[i], sum[i] / cnt[i] | "sort -nk1"
}' vals.txt
$ awk 'NR == FNR { low = $1 - $2; high = $1 + $2; next }
       $1 >= low && $1 <= high { sum += $1; count += 1 }
       END { print sum / count }' <(datamash mean 1 pstdev 1 < vals.txt) vals.txt
62.9167