2015-07-17 1 views
3

части моего файла данных выглядитРаспределения вероятностей каждых уникальных чисел в массиве (длину неизвестной) после исключения нулей

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

Я хотел бы найти вероятность каждого номера, за исключением нулей. например Р (1) = 2/8; Р (3) = 4/8 и так далее

выход Desire

ofile.txt 
1 0.250 
3 0.500 
5 0.125 
6 0.125 

Где 1-й столбец показывает уникальные номера, кроме 0 и 2-го столбца показывает вероятность. Я старался следовать, но выглядит очень длинной идеей. Я перед проблемой в течение цикла, так как есть много уникальных номеров

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 

ответ

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 
+0

Спасибо @Barmar. Это хорошо работает. – Kay

3

Как насчет sort | uniq -c, чтобы получить отчетливое число отсчитывает в ~ п войти п вместо п^2 раз, а затем запустить что путем деления по вашему полному ненулевому счету от wc -l?

+0

Спасибо @Novelocrat за ваше предложение. Но я не мог решить ее до ответа snd. – Kay

3

Вот способ использования Novelocrat «s 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;} итоги Col 1 из i в n (next пропускает следующую команду), а затем печатает print $2,$1/n Col 2 из i и частное Col 1 над n.

+0

Спасибо, @snd, это также хороший метод. – Kay

+1

'/ 0 /! P' также удалит' 10', '20' и т. Д. – Barmar

+0

@Barmar Спасибо :) Я исправил его (я думаю) – snd

 Смежные вопросы

  • Нет связанных вопросов^_^