我的部分数据文件显示为
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
答案 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;}
总计i
中n
的第1列(next
跳过下一个命令),然后print $2,$1/n
打印{2} { {1}}和col 1超过i
的商。