一个文件:
3
7
10
5
-100
100
我想写一个程序,把那些大于小于3sigma范围的行删去,即(平均值+-3*标准差)之外,很明显-100,100该去掉。如何写运行快??
如果用if是不是太慢。
去掉3sigma之外的行如何写?
-
- 帖子: 91
- 注册时间: 2013-01-23 14:27
- 系统: ubuntu 12.04
-
- 帖子: 91
- 注册时间: 2013-01-23 14:27
- 系统: ubuntu 12.04
Re: 去掉3sigma之外的行如何写?
mean=`cat ${region}_SIMLC/$i | awk '{a+=$2}END{print a/"'"$NR"'"}' `
cat ${region}_SIMLC/$i | awk '{print ($2-"'"$mean"'")*($2-"'"$mean"'")}' > temp
sig=`cat temp | awk '{a+=$1}END{printf "%.4f",(a/"'"$NR"'")^0.5}'`
up=`echo "scale=3;$mean+3*$sig" | bc`
down=`echo "scale=3;$mean-3*$sig" | bc`
for (( j=1 ; j<= $NR ; j=j+1 ))
do
mag=`cat ${region}_SIMLC/$i | sed -n ${j}p | awk '{print $2}'`
if [`echo "scale=3;$mag > $up " |bc` == 1 || `echo "scale=3;$mag < $down " |bc` == 1 ] ; then
sed -i ${j}d ${region}_SIMLC/$i
j=$(($j-1))
NR=$(($NR-1))
else
continue
fi
done
不知道哪里出问题了?
cat ${region}_SIMLC/$i | awk '{print ($2-"'"$mean"'")*($2-"'"$mean"'")}' > temp
sig=`cat temp | awk '{a+=$1}END{printf "%.4f",(a/"'"$NR"'")^0.5}'`
up=`echo "scale=3;$mean+3*$sig" | bc`
down=`echo "scale=3;$mean-3*$sig" | bc`
for (( j=1 ; j<= $NR ; j=j+1 ))
do
mag=`cat ${region}_SIMLC/$i | sed -n ${j}p | awk '{print $2}'`
if [`echo "scale=3;$mag > $up " |bc` == 1 || `echo "scale=3;$mag < $down " |bc` == 1 ] ; then
sed -i ${j}d ${region}_SIMLC/$i
j=$(($j-1))
NR=$(($NR-1))
else
continue
fi
done
不知道哪里出问题了?