排除零后数组(长度未知)中每个唯一数字的概率分布
Probability Distribution of each unique numbers in an array (length unknown) after excluding zeros
我的部分数据文件看起来像
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 ' > 0 {print [=12=]}' ifile.txt | wc -l)
for i in 1 3 5 6 .....
do
n1=$(awk ' == $i {print [=12=]}' 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 '[=10=] != "0" { count[[=10=]]++; 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+=;next;}{print ,/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+=;next;}
总计 n
中 i
的第 1 列(next
跳过下一个命令),然后 print ,/n
打印第 2 列i
和 col 1 对 n
.
的商
我的部分数据文件看起来像
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 ' > 0 {print [=12=]}' ifile.txt | wc -l)
for i in 1 3 5 6 .....
do
n1=$(awk ' == $i {print [=12=]}' 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 '[=10=] != "0" { count[[=10=]]++; 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+=;next;}{print ,/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+=;next;}
总计 n
中 i
的第 1 列(next
跳过下一个命令),然后 print ,/n
打印第 2 列i
和 col 1 对 n
.