View on GitHub

q

q - Text as Data

Download the last stable version zip file Download the last stable version tar.gz file Download the latest stable version RPM Download the latest stable version Debian package Download the single-file executable Download the single-file executable

一般

ドキュメント

舞台裏

作者

Social

概要

`q <flags> <query>`

          最もシンプルなコマンドは `q "SELECT * FROM myfile"` で、ファイル全体を表示します。
        

説明

q は SQL ライクな命令を表形式のテキストデータに対して実行することができます。SQL の強力な表現を Linux のコマンドラインで実行できるようにし、より簡単にテキストデータを扱えるようにするために作られました。

クエリはテーブル名の代わりにファイル名を含めます。(もしくは、標準入力の - でも可能) クエリは1つのパラメータとして渡してください。(すなわち、クオートで囲む)

-H オプションを渡すと、ヘッダー行をカラム名として認識します。この場合、カラム名は自動的に検出され、クエリ中で使用することができます。もし、このオプションを使用しない場合は、カラムは左から cX (Xは1から始まる) として名付けられます。(例 q "SELECT c3,c8 from ...")

-d オプションを使うと入力データのデリミタを指定できます。

カラムの型は自動検出されるので、キャストは不要です。

カラム名にスペースを含む必要がある時は、SQLite 標準の通り、クエリ中でバックティック(``)で囲んでください。

クエリ/入力データ/出力データのエンコードは完全サポートしています。(q はこの部分に関して、追加設定なしのユーザビリティを試みています) それぞれ、必要に応じて、-e,-E and -Q オプションを使用してください。

それぞれのテーブルにエイリアスを設定し、ファイルをまたいだ JOIN を含めて、SQLite3 の SQL 構造を全てサポートしています。

さらに詳細を知りたい場合は、https://github.com/harelba/q を参照してください。

クエリ

q は "SQL ライクなクエリ"、たった1つをパラメータとして取得します

標準的な SQL 表現、条件文(WHERE、HAVING 両方とも)、GROUP BY、ORDER BY 等が使えます。

JOIN は WHERE 節のサブクエリとしてはサポートしていますが、FROM 節で使用するのは現時点で、未対応です。JOIN するときに、テーブルにエイリアスを設定して使ってください。

SQL 文法は、SQLite の文法と同じです。詳細は http://www.sqlite.org/lang.html を参照するか、インターネットで例を検索してみてください。

重要: 型検出が実装されているので、キャスト等の操作は一切不要です。

重要2: 出力ヘッダーオプションである、-O を使用して、出力ヘッダのカラム名を制御したい場合、カラム名をエイリアスとして明示的に指定してください。たとえば、q -O -H "select count(*) as cnt,sum(*) as mysum from -" とすると、cntmysum が出力ヘッダーとして名前がつきます。

RUNTIME OPTIONS

q can also get some runtime flags. The following parameters can be used, all optional:

Options:
                -h, --help            show this help message and exit
                -v, --version         Print version

                Input Data Options:
                -H, --skip-header   Skip header row. This has been changed from earlier
                version - Only one header row is supported, and the
                header row is used for column naming
                -d DELIMITER, --delimiter=DELIMITER
                Field delimiter. If none specified, then space is used
                as the delimiter.
                -t, --tab-delimited
                Same as -d <tab>. Just a shorthand for handling
                standard tab delimited file You can use $'\t' if you
                want (this is how Linux expects to provide tabs in the
                command line)
                -e ENCODING, --encoding=ENCODING
                Input file encoding. Defaults to UTF-8. set to none
                for not setting any encoding - faster, but at your own
                risk...
                -z, --gzipped       Data is gzipped. Useful for reading from stdin. For
                files, .gz means automatic gunzipping
                -A, --analyze-only  Analyze sample input and provide information about
                data types
                -m MODE, --mode=MODE
                Data parsing mode. fluffy, relaxed and strict. In
                strict mode, the -c column-count parameter must
                be supplied as well
                -c COLUMN_COUNT, --column-count=COLUMN_COUNT
                Specific column count when using relaxed or strict
                mode
                -k, --keep-leading-whitespace
                Keep leading whitespace in values. Default behavior
                strips leading whitespace off values, in order to
                provide out-of-the-box usability for simple use cases.
                If you need to preserve whitespace, use this flag.

                Output Options:
                -D OUTPUT_DELIMITER, --output-delimiter=OUTPUT_DELIMITER
                Field delimiter for output. If none specified, then
                the -d delimiter is used if present, or space if no
                delimiter is specified
                -T, --tab-delimited-output
                Same as -D <tab>. Just a shorthand for outputing tab
                delimited output. You can use -D $'\t' if you want.
                -O, --output-header
                Output header line. Output column-names are determined
                from the query itself. Use column aliases in order to
                set your column names in the query. For example,
                'select name FirstName,value1/value2 MyCalculation
                from ...'. This can be used even if there was no
                header in the input.
                -b, --beautify      Beautify output according to actual values. Might be
                slow...
                -f FORMATTING, --formatting=FORMATTING
                Output-level formatting, in the format X=fmt,Y=fmt
                etc, where X,Y are output column numbers (e.g. 1 for
                first SELECT column etc.
                -E OUTPUT_ENCODING, --output-encoding=OUTPUT_ENCODING
                Output encoding. Defaults to 'none', leading to
                selecting the system/terminal encoding

                Query Related Options:
                -q QUERY_FILENAME, --query-filename=QUERY_FILENAME
                Read query from the provided filename instead of the
                command line, possibly using the provided query
                encoding (using -Q).
                -Q QUERY_ENCODING, --query-encoding=QUERY_ENCODING
                query text encoding. Experimental. Please send your
                feedback on this

              

テーブル名

テーブル名は読み込みたいファイル名となります。パスも許可されています。もし標準入力からデータを読みたい場合は "-" を使ってください。(例:q "SELECT * FROM -")

複数ファイルは以下の方法で連結することができます。

.gz 拡張子を持つファイルは、中間ファイルを出力せずとも演算できます。-z オプションを使用してください。

パースモード

q は複数のパースモードをサポートしています:

出力フォーマットオプション

F のフォーマットは、コンマ区切りの X=f のリストで、X はカラム番号であり、f は python のフォーマットです:

使用例

例 1: ls -ltrd * | q "select c1,count(1) from - group by c1"

この例は、現在のディレクトリの中で、それぞれのパーミッション文字列をカウントし、その結果を表示します。

例 2: seq 1 1000 | q "select avg(c1),sum(c1) from -"

この例は、1 〜 1000 の範囲の数字の平均と総和を表示します。

例 3: sudo find /tmp -ls | q "select c5,c6,sum(c7)/1024.0/1024 as total from - group by c5,c6 order by total desc"

この例は、/tmp サブツリー内の、ユーザとグループごとに MB 単位で合計サイズを表示します。

例 4: ps -ef | q -H "select UID,count(*) cnt from - group by UID order by cnt desc limit 3"

この例は、ps コマンドで計算されたデータをもとに、UID ごとにプロセス数を表示します。カラム名は ps によって提供されるものを、 -H フラグを立てることで有効にしてクエリ内で使用しています。

作者

Harel Ben-Attia (harelba@gmail.com)

@harelba on Twitter

どんなフィードバックや提案や不満も歓迎しています。もちろん、協力してくれるのも大歓迎です。

著作権

Copyright (C) 2012--2014 Harel Ben Attia

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version.

This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA