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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s