Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 排除零后数组中每个唯一数(长度未知)的概率分布_Linux_Shell_Unix_Awk_Probability Density - Fatal编程技术网

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谢谢:)我已经修复了(我想)