从文件生成直方图

给定每行包含一个单一数字的input文件,我怎么能得到一个项目在该文件中发生了多less次?

cat input.txt 1 2 1 3 1 0 

所需输出(=> [1,3,1,1]):

 cat output.txt 0 1 1 3 2 1 3 1 

如果解决scheme也可以扩展为浮动数字,那将是非常好的。

你的意思是你想要一个项目出现在input文件中的次数? 首先对它进行sorting(如果input始终是数字,则使用-n ),然后计算唯一的结果。

 sort -n input.txt | uniq -c 

另外一个select:

 awk '{n[$1]++} END {for (i in n) print i,n[i]}' input.txt | sort -n > output.txt 

除了其他的答案之外,你可以用awk来做一个简单的图表 。 (但是,这又不是直方图。)

至less有一些可以完成

 sort output.txt | uniq -c 

但是订单number count倒过来了。 这将解决这个问题。

 sort test.dat | uniq -c | awk '{print $2, $1}' 

使用Debian stda软件包中的maphimbu :

 # 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 
 perl -lne '$h{$_}++; END{for $n (sort keys %h) {print "$n\t$h{$n}"}}' input.txt 

-n循环每一行
每个$_数字都会增加散列%h
一旦达到input.txtEND
数字sort哈希
打印数字$n和频率$h{$n}

在浮点上工作的类似代码:

 perl -lne '$h{int($_)}++; END{for $n (sort 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