それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Linuxのテキスト処理で集計したい。単語出現回数を調べる mcount

単語の出現回数をサクッと調べたい。

takuya 4
Lkue    1
yoshi   2

みたいな出力がほしい時がある。

Linuxでテキスト処理をやっていると、なんでこれくらいが出来ないんだ!そうおもって作ってるコマンド

次の名前一覧がある時

takuya@air:~/Desktop$ cat test 
takuya
yoshi
takuya
takuya
takuya
yoshi
Luke

名前の登場回数を数えたい

cat test |sort | ./count 
1	
1	Luke
4	takuya
2	yoshi

これくらいコマンドでできたら嬉しい。

mcount

mcount というコマンドを作ってみた。

#!/usr/bin/env ruby
# coding:utf-8
require 'kconv'
$KCODE='u' 
count = 1;
word  =  gets().strip
while tmp = gets()
  tmp.strip!
  count = count + 1 if word == tmp
  unless word == tmp then 
   #puts  "#{word}\t#{count}".toutf8
   puts  "#{count}\t#{word}".toutf8 
   word = tmp
   count = 1 
  end 
end
puts  "#{count}\t#{word}".toutf8

松田さんという◯イエーの情報処理のアドバイザしてた人が、20年も前に作ったコマンドの事を大学の恩師から訊いた。UNIXのパイプラインを徹底的に組み合わせて、複雑な情報処理をやろうという発想。初心者がSQLなんて覚えるの大変だし、、ベンダーロックインやら、技術の継承が大変。しかもJOIN地獄になる。なのでやっぱりUNIXUNIXらしく、コマンドを組み合わせて使うのが最高。業務で使えば良いじゃん。

っていう発想。真っ当な発想だ。えらく感銘をうけて、できる限りコマンドを組み合わせてデータ処理するようになった。

この発想は面白いので、発想だけ頂いた。


コマンドまるごとパクるのはあれなので、rubyでサクッと作ってある。
ソート済みのデータ処理はほんとうに早いね
パフォーマンスが必要なら、Cで実装すればいいし。そもそも大量行を処理するならruby1.8のIOは遅いので、使いものにならないよ。


◯イエーがイオンやセブンイレブンよりいち早く売れ筋分析のPOSデータ分析が出来たのが、自社で使ってたUNIXコマンドのおかげだそうだ。
満足なCPUの無い時代に、小さいコマンドを組み合わせてた。小さいデータに分けて集計、分析、まとめては集計。なんだそれ!いまの分散処理じゃないか!



◯イエーの急成長には、このシンプルな分散処理が武器になって一役買ってたらしい。セブンイレブンのPOSガーとかもてやはしてるが、◯イエーのほうが一枚上手だった。





松田御大ともなんどかお話させていただいた。
大学の恩師と先輩と松田さん、いつもお世話になっております。