概率在排除零之后分配数组中的每个唯一数字(长度未知)

时间:2015-07-17 02:22:52

标签: linux shell unix awk probability-density

我的部分数据文件显示为

ifile.txt
1
1
3
0
6
3
0
3
3
5

我想找出除零之外的每个数字的概率。例如P(1)= 2/8; P(3)= 4/8等等

欲望输出

ofile.txt
1  0.250
3  0.500
5  0.125
6  0.125

第1列显示除0和第2列之外的唯一数字显示概率。我正在尝试如下,但看起来非常冗长的想法。我在for循环中遇到问题,因为有这么多唯一数字

n=$(awk '$1 > 0 {print $0}' ifile.txt | wc -l)
for i in 1 3 5 6 .....
do
n1=$(awk '$1 == $i {print $0}' ifile.txt | wc -l)
p=$(echo $n1/$n | bc -l)
printf "%d %.3f\n" "$i $p" >> ofile.txt
done

3 个答案:

答案 0 :(得分:5)

awk中使用关联数组,一次性获取每个唯一数字的计数。

awk '$0 != "0" { count[$0]++; total++ } 
     END { for(i in count) printf("%d %.3f\n", i, count[i]/total) }' ifile.txt | sort -n > ofile.txt

答案 1 :(得分:3)

如果sort | uniq -c得到明确的数字在~n log n而不是n ^ 2时间计算,然后通过除以wc -l的总非零数量来划分除以?{<1} / p>

答案 2 :(得分:3)

以下是使用Novelocrat sort|uniq -c建议的方式:

sed '/^0/ d' ifile.txt|sort|uniq -c >i
awk 'FNR==NR{n+=$1;next;}{print $2,$1/n}' i i

简短说明

删除以0&#39; s sed '/^0/ d' ifile.txt

开头的数字

sort|uniq -c >i为您提供i

   2 1
   4 3
   1 5
   1 6

在awk中,FNR==NR{n+=$1;next;}总计in的第1列(next跳过下一个命令),然后print $2,$1/n打印{2} { {1}}和col 1超过i的商。