awk数学公式:有没有办法用包含字段的数字替换NF?

时间:2017-02-02 02:10:17

标签: awk statistics

我有一个包含许多行的文件,其中包含三个信息列,后面跟着许多数据列:

A    B    C    0.15    0.23    0.21    0.67

偶尔会有一列缺少数据点,并填充“未找到”字样,例如:

A    B    C    0.15    not found    0.21    0.67

我的awk公式计算标准差为:

awk '{ A=0; V=0; for(N=4; N<=NF; N++) A+=$N ; A/=(NF-3) ; for(N=4; N<=NF; N++) V+=(($N-A)*($N-A))/(NF-4); print sqrt(V) }' file.txt

然而,正如你所看到的,这个公式会给出一个NF-3(除前3个以外的所有列)4,当有3个数据字段时。所以平均计算除以4而不是3,方差计算的底值(n-1)也是如此。

有没有办法让awk只计算包含字段的数字,以便跳过“未找到”?或者是否更好地使用R?

3 个答案:

答案 0 :(得分:1)

在处理记录之前,您可以在not found时将0替换为NF>7,并捕获所做的替换次数(下面为var replacements)并从中减去除数:

awk 'NF>7 { replacements = gsub(/not found/,0) } { # your original code here }

答案 1 :(得分:0)

可以计算非数字,然后从计算中删除它:

{
    A=0;
    V=0;
    NAN=0;
    for(N=4; N<=NF; N++) {
        A+=$N;

        # Check if this is a non number
        if (! ($N ~ /^-?[0-9.]+$/))
            NAN++;
    }
    A/=(NF-3);
    if (NAN <= NF - 4) {
        for (N=4; N<=NF; N++)
            V+=(($N-A)*($N-A))/(NF-4-NAN);
        print sqrt(V)
    }
}

答案 2 :(得分:0)

我找到了答案。

首先,“Not Found”应固定为“NotFound”,以避免将其作为两个字段读取。

其次,我使用gsub:

添加了使用“NotFound”的字段数
awk '{ A=0; V=0; for(N=4; N<=NF; N++) A+=$N ; A/=(NF-3-(gsub(/NotFound/, ""))) ; for(N=4; N<=NF; N++) V+=(($N-A)*($N-A))/(NF-4-(gsub(/NotFound/, ""))); print sqrt(V) }' file.txt