Awk数学公式:有没有办法将NF替换为包含字段的位数?

Awk数学公式:有没有办法将NF替换为包含字段的位数?,awk,statistics,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<

我有一个文件,其中有许多行,如下所示,有三个信息列,后跟许多数据列:

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

awk'{A=0;V=0;for(N=4;N可以计算非数字,然后从计算中删除:

{
    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)
    }
}
{
A=0;
V=0;
NAN=0;

对于(N=4;N在处理记录之前,当
NF>7
时,您可以用
0
替换
未找到的
,并捕获所做替换的数量(以下为var
替换
),然后从除数中减去:

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

我找到了答案

首先,“未找到”应固定为“未找到”,以避免将其作为两个字段读取

其次,我使用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

awk'{A=0;V=0;用于(N=4;N谢谢你,但是为什么使用NF>7?@DanS
NF>7
可能是因为
未找到
看起来像两条记录。但是此解决方案会将丢失的样本设置为零样本,并且可能不是你想要的统计数据。'chr1 800 0.55 0.54 0.52 chr2 801 0.09 1chr3 802 802 0.88 0.2 0.2 chr4 803 804找不到此文件的0.1 0.12',它不起作用,因为它说有一个致命的零除法尝试。当我要求打印NAN时,我得到以下信息:1 2 3 4I将查看一下。对于这类事情,在Stackoverflow上最好做的事情是编辑数据让每个人都能看到你的问题。看起来空行是问题所在?不管怎样,只是在检查行中没有好的数据时进行了编辑。