从文本文件中删除异常值

时间:2019-04-22 10:49:12

标签: unix awk statistics

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

vals.txt

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

此后,我需要从列中计算平均值。

尝试输入的密码

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

1 个答案:

答案 0 :(得分:2)

您的问题非常模糊,因此我将假设一个离群值与整体均值超过一个标准差(其中还将排除57),并且所有非离群值的均值为最后要的那个。

(以下内容使用a re-design进行数字运算,因为我不想查找(人口)标准偏差公式并以awk的形式进行计算)

$ 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

如果这些假设是错误的,请修正您的问题以反映您使用什么作为异常值的定义,以及在给定样本数据的情况下您希望结果如何,我将适当地对其进行更新或删除。