发生频率

发生频率

我有一个制表符分隔的文本文件,大约 3K 行长。

我想计算其中出现的数据频率(10,000 个范围)。

输入.txt

Price  
500    
1500   
10001   
15000  
17000  
25000  
33000  
39000  
:
:
8000000 

输出.txt

Pricerange      pricerangecount  
0-10000          2               
10000-20000      3               
20000-30000      1               
30000-40000      2 
:
:  

答案1

awk 'BEGIN{print "Pricerange\tpricerangecount"}
     NR>1 {cur=int($0/10000); A[cur]+=1; if (cur>m) m=cur; }
     END {for(i=0;i<=m;i++) printf("%d-%d:\t%d\n",i*10000, (i+1)*10000, A[i])}' 

答案2

我一般使用gsl-histogram来自GNU 科学图书馆包裹。正如您的情况一样(没有漂亮的打印,以前的解决方案都可以,我已经对它们投了赞成票):

  tail -n+2 Input.txt | gsl-histogram 0 40000 4

答案3

珀尔:

perl -ne'$h{int$_/10000}++;END{printf"%d0000-%d0000  %d\n",$_,$_+1,$h{$_}for sort{$a<=>$b}keys%h}'

扩展:

while(<>) { #read each line (-n)
  $h{int $_/10000}++; #count buckets
}
for (sort {$a<=>$b} keys %h) { #sort numerically
  printf "%d0000-%d0000  %d\n", $_, $_+1, $h{$_};
}

答案4

虽然 bash 不是一个好的解决方案,但根据评论,这里有另一个解决方案

N=10000
while read n;do [[ $n =~ ^[0-9]*$ ]]&&((a[n/N]++));done
for i in ${!a[*]};do echo $((i*N))-$(((i+1)*N-1)) $((a[i]));done

它在小文件上会更快,因为没有产生新进程的开销,但在大文件上效率较低。

相关内容