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?@DanSNF>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上最好做的事情是编辑数据让每个人都能看到你的问题。看起来空行是问题所在?不管怎样,只是在检查行中没有好的数据时进行了编辑。