我有一个包含许多行的文件,其中包含三个信息列,后面跟着许多数据列:
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?
答案 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