約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
新しいプロセスを作成するためのオーバーヘッドがないため、小さなファイルではより高速ですが、大容量ファイルでは効率が低下します。