Linux 排除零后数组中每个唯一数(长度未知)的概率分布
我的数据文件的一部分看起来像Linux 排除零后数组中每个唯一数(长度未知)的概率分布,linux,shell,unix,awk,probability-density,Linux,Shell,Unix,Awk,Probability Density,我的数据文件的一部分看起来像 ifile.txt 1 1 3 0 6 3 0 3 3 5 我想找出每个数字不包括零的概率。e、 g.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
ifile.txt
1
1
3
0
6
3
0
3
3
5
我想找出每个数字不包括零的概率。e、 g.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
用
sort | uniq-c
来获得~n log n中的不同数字计数,而不是n^2次,然后用wc-l
中的总非零计数进行除法,怎么样?使用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
下面是一种使用的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开头的数字sed'/^0/d'ifile.txt
sort | uniq-c>i
为您提供i
:
2 1
4 3
1 5
1 6
在awk中,
FNR==NR{n+=$1;next;}
总计n
中i
的第1列(next
跳过下一个命令),然后print$2,i
的第2列和第1列对n
的商,谢谢@Novelocrat。但直到snd的回答,我才能够解决这个问题。/0/!p
还将删除10
,20
,等等@Barmar谢谢:)我已经修复了(我想)