создание таблицы частот из файла
Учитывая входной файл, содержащий одно единственное число на строку, как я могу получить подсчет количества раз, когда элемент имел место в этом файле?
cat input.txt
1
2
1
3
1
0
желаемый выход (= > [1,3,1,1]):
cat output.txt
0 1
1 3
2 1
3 1
Было бы здорово, если бы решение можно было также расширить для плавающих чисел.
Ответы
Ответ 1
Вы хотите, чтобы вы подсчитали, сколько раз элемент появляется во входном файле? Сначала отсортируйте его (используя -n
, если вход всегда имеет число, как в вашем примере), затем подсчитайте уникальные результаты.
sort -n input.txt | uniq -c
Ответ 2
Другая опция:
awk '{n[$1]++} END {for (i in n) print i,n[i]}' input.txt | sort -n > output.txt
Ответ 3
По крайней мере, некоторые из них можно сделать с помощью
sort output.txt | uniq -c
Но порядок number count
отменяется. Это устранит эту проблему.
sort test.dat | uniq -c | awk '{print $2, $1}'
Ответ 4
В дополнение к другим ответам вы можете использовать awk для создания простого графика. (Но, опять же, это не гистограмма.)
Ответ 5
Используя maphimbu
из пакета Debian stda:
# use 'jot' to generate 100 random numbers between 1 and 5
# and 'maphimbu' to print sorted "histogram":
jot -r 100 1 5 | maphimbu -s 1
Вывод:
1 20
2 21
3 20
4 21
5 18
maphimbu
также работает с плавающей точкой:
jot -r 100.0 10 15 | numprocess /%10/ | maphimbu -s 1
Вывод:
1 21
1.1 17
1.2 14
1.3 18
1.4 11
1.5 19
Ответ 6
perl -lne '$h{$_}++; END{for $n (sort keys %h) {print "$n\t$h{$n}"}}' input.txt
-n
каждую строку с помощью -n
Каждое число $_
увеличивает хеш %h
Как только будет достигнут END
input.txt
,
sort {$a <=> $b}
числовой хеш
Выведите число $n
и частоту $h{$n}
Аналогичный код, который работает с плавающей точкой:
perl -lne '$h{int($_)}++; END{for $n (sort {$a <=> $b} keys %h) {print "$n\t$h{$n}"}}' float.txt
float.txt
1.732
2.236
1.442
3.162
1.260
0.707
выход:
0 1
1 3
2 1
3 1