발생빈도

발생빈도

약 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

새 프로세스를 생성하는 데 따른 오버헤드가 없기 때문에 작은 파일에서는 더 빠르지만 대용량 파일에서는 효율성이 떨어집니다.

관련 정보