2016-02-01 6 views
0

Я написал код для расчета zscore, который вычисляет среднее и стандартное отклонение от одного файла и использует некоторые значения из строк в другом файле, следующим образом:Divide плавает в AWK

mean=$(awk '{total += $2; count++} END {print total/count}' ABC_avg.txt) 
#calculating mean of the second column of the file 
std=$(awk '{x[NR]=$2; s+=$2; n++} END{a=s/n; for (i in x){ss += (x[i]-a)^2} sd = sqrt(ss/n); print sd}' ABC_avg.txt) 
#calculating standard deviation from the second column of the same file 
awk '{if (std) print $2-$mean/$std}' ABC_splicedavg.txt" > ABC.tmp 
#calculate the zscore for each row and store it in a temporary file 
zscore=$(awk '{total += $0; count++} END {if (count) print total/count}' ABC.tmp) 
#calculate an average of all the zscores in the rows and store it in a variable 
echo $motif" "$zscore 
rm ABC.tmp 

Однако, когда я исполняю этот код, на этапе создания временного файла, я получаю сообщение об ошибке как fatal: деление на нуль предпринято, что является правильным способом реализации этого кода? TIA I использовал параметр bc -l, но он дает очень длинную версию плавающего целого.

+0

Баш переменные не видны в 'awk' одинарные кавычки. Вы должны определить их с помощью опции -v. Однако лучше переделать так, чтобы все были вычислены в одном скрипте, так что вам не нужно передавать переменные между сценариями. – karakfa

ответ

1

Вот скрипт для вычисления среднего и станд за один проход, вы можете потерять некоторое разрешение, если не приемлемо есть альтернативы ...

$ awk '{print rand()}' <(seq 100) 
    | awk '{sum+=$1; sqsum+=$1^2} 
     END{print mean=sum/NR, std=sqrt(sqsum/NR-mean^2), z=mean/std}' 

0.486904 0.321789 1.51312 

Ваш скрипт для г-баллов для каждого образца не так! Вам нужно сделать ($ 2-mean)/std.

+0

Я делаю это в строке: awk '{if (std) print $ 2- $ mean/$ std}' ABC_splicedavg.txt "> ABC.tmp – AishwaryaKulkarni

+0

' $ mean' или '$ std' - это не то, что вы подумайте, что они в скрипте. Они не определены в одинарных кавычках. Вам нужно передать их в 'awk' с помощью' -v mean = $ {mean} ..' и использовать без префикса доллара в скрипте. – karakfa

1

Вы можете контролировать точность вашей продукции с нашей эры, используя переменную scale:

$ echo "4/7" | bc -l 
.57142857142857142857 
$ echo "scale=3; 4/7" | bc -l 
.571