2015-07-13 2 views
1

У меня есть файл данных с 10 столбцов, как указано нижекак вычислить стандартное отклонение от различных colums в сценарии оболочки

ifile.txt 
2 4 4 2 1 2 2 4 2 1 
3 3 1 5 3 3 4 5 3 3 
4 3 3 2 2 1 2 3 4 2 
5 3 1 3 1 2 4 5 6 8 

Хочу добавить 11-й столбец, который будет показывать стандартное отклонение каждого ряда по 10 столбцов. то есть STDEV (2 4 4 2 1 2 2 4 2 1) и так далее. я могу сделать, принимая tranpose, то, используя следующую команду и снова взяв транспонирование

awk '{x[NR]=$0; s+=$1} END{a=s/NR; for (i in x){ss += (x[i]-a)^2} sd = sqrt(ss/NR); print sd}' 

Кто-нибудь может предложить более простой способ, так что я могу сделать это непосредственно вдоль каждой строки.

ответ

3

Вы можете сделать то же самое за один проход.

awk '{for(i=1;i<=NF;i++){s+=$i;ss+=$i*$i}m=s/NF;$(NF+1)=sqrt(ss/NF-m*m);s=ss=0}1' ifile.txt 
2

Вы имеете в виду что-то вроде этого?

awk '{for(i=1;i<=NF;i++)s+=$i;M=s/NF; 
     for(i=1;i<=NF;i++)sd+=(($i-M)^2);$(NF+1)=sqrt(sd/NF);M=sd=s=0}1' file 

2 4 4 2 1 2 2 4 2 1 1.11355 
3 3 1 5 3 3 4 5 3 3 1.1 
4 3 3 2 2 1 2 3 4 2 0.916515 
5 3 1 3 1 2 4 5 6 8 2.13542 

Вы просто используете поля вместо транспонирования и использования строк.

Смежные вопросы