UNIX/Linux環境でcsv/tsvにクエリを投げることができるqが便利すぎて生きるのが辛い

UNIX/Linux環境でSQLコマンドが使えたらいいのに、と思ったことはありませんか?
私はあります。

10万〜100万行レベルのデータを集計したいけど、わざわざDBにぶっ込むほどではない。
そんな時は、awk, join, grep, paste, wc, uniqなどなどの各種コマンドを駆使して集計しています。

ちなみに、joinコマンドに関してはここに大変お世話になりました。
本当に便利すぎて生きるのが辛いです。

◆joinコマンドが便利過ぎて生きるのが辛い
http://d.hatena.ne.jp/yutakikuchi/20120907/1346975281

ただ、これが複数ファイルにまたがって処理をしたりして、複雑になってくるとだんだん何のデータを操っているか混乱してきます。
そんなときに、カジュアルにtsv, csvファイルに対してqueryを投げられたらいいのになぁと感じていました。

そんなときに、これを見つけました。

◆q – Treating Text as a Database
https://github.com/harelba/q

q という超絶短いコマンドのため、単語のググラビリティ(単語のググられやすさ/ググりやすさ。)が悪すぎて、あまり発見されないかもしれません。

俺が求めていたのはコレだぁ!
ということで、実務でも使っています。

もっと普及して欲しいので、インストール手順からちょっとした実行サンプルを紹介します。

久々に見てみたら、brewでインストールできるようになってました。下記インストール手順参照のこと。(2015/07/24 追記)
http://harelba.github.io/q/install.html

必要環境はPython 2.5以上か、SQLite3モジュールがインストールされているPython 2.4以上です。
(Python 2.5は、SQLite3が標準バンドルされています)

中身を見てみると、1行目にインタプリタの指定があります。
自分の環境は、2.4.3と2.7.1の両バージョンがインストールしてあるため、2.7.1で実行されるように変更します。

実行してみます。

動きました。

PATHを通します。

.zshrcに以下を追記。

パスが通りました!

Examplesが載っているので、試しにそのまま入力してみます。

おー!
素晴らしい。

% seq 1 1000

1
2
3
4
5
(略)
1000

を出力して、
これを標準入力として q に渡す。
c1というのが、カラムの1番目という意味なので、
avg(c1)で、1〜1000の総和の平均
sum(c1)で、1〜1000の総和が出力されています。

こんな風にgroup byも使える!

ちなみにawkでやろうとするとこうですか。

joinも書けます。

SQLに馴染みのある人はqを使ったほうがサクッと書けていいですね。

terminal

高専卒→大学編入中退→起業→転職を経て、ソーシャルゲームを作ったあと、とあるアプリのサーバサイドエンジニアをやっています。 技術の未来予測とかデザインのリノベーションとか、おぎやはぎとかネギトロ丼が好きです。 猫飼いたい。 twitterは@serimaです。お気軽にfollow/unfollowどぞ(゚∀゚)

下の「いいね」ボタンを押すと、やる気パラメータが+1!


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です