2ファイルの両方に含まれる行一覧を出すコマンドの速度の比較

2ファイルの両方に含まれる行を出したい時って結構ありませんか?今回僕がやりたかったのはIPアドレスが1行に一つずつ書いてある2ファイルから共通部分を取り出すというものです。

今まではbashのforループ回してたりしてたこともありましたがファイルが大きいと遅いのでやり方を探してみました。僕は長い間データベース屋さんだったのでまずはSQLでJOINするツールを使ってみました。

harelba/q: q – Run SQL directly on CSV or TSV files

q treats ordinary files as database tables, and supports all SQL constructs, such as WHERE, GROUP BY, JOINs etc.

こんな感じ

 $ time /c/c/Program\ Files\ (x86)/q-TextAsData/q \
 "select ip1.c1 from c:/tmp/ipv4.txt ip1 join ./ipv4_2.txt ip2 on ( ip1.c1=ip2.c1 )"
 127.0.0.1
 [...略...]
 real 0m5.399s
 

さてGoogleったらgrep1発、および ‘comm’ ってコマンドでできることがわかりました。

intersection between two files | commandlinefu.com

comm file1 file2 can be used to find the intersection

grep がこんな感じ

 $ time grep -Fx -f /c/c/tmp/ipv4.txt ./ipv4_2.txt
 127.0.0.1
 [...略...]
 real 0m2.174s
 

comm はこんな感じ

 $ time comm -1 -2 /c/c/tmp/ipv4.txt <(sort ./ipv4_2.txt)
 127.0.0.1
 [...略...]
 real 0m0.708s
 

comm が一番速いですね。/usr/bin/join も試してみよう

 

Advertisements

11/10:フランス、リールでの日本代表ブラジル戦

11月の対ブラジル代表戦が弊社のフランス開発拠点のあるリールで行われることを知りました。

ハリルジャパン 11月の欧州遠征でブラジル、ベルギーと対戦― スポニチ Sponichi Annex サッカー

監督の自宅のあるフランス北部リールで、指揮官にとっての“凱旋試合”となる。

ハリルホジッチ監督がフランスで最初に監督したチームがLOSCという縁なのかリールに家があるそうです。

Vahid Halilhodžić – Wikipedia

His primary residence is in Lille

日本から個人で応援に行く場合、リール駅からの移動になると思います。Uberがいいかと思いますが公共自転車シェアシステムでも40分ぐらいで着くと思います。最寄りの自転車ステーションは以下です。

Les stations V’lille

Heron Parc

スタッド・ピエール=モーロワ、および、周辺はこんな感じですよ。ホテルも隣接してます。