q 是一個(gè)可以在命令行直接對(duì)文本文件(如CSV、TSV或者任何其它文本文件剪决、甚至標(biāo)準(zhǔn)輸入)執(zhí)行 SQL 語句的工具舀寓。
使用q可以直接對(duì)文本做一些簡(jiǎn)單的探索性分析胯舷,避免使用數(shù)據(jù)庫的建表、導(dǎo)入等過程谋旦;同時(shí)也可以一定程度的替代 awk
剩失,與其它 Linux 命令結(jié)合做一些簡(jiǎn)單的統(tǒng)計(jì)分析。
示例:
# 過濾出 clicks_file.csv 文件里第三列大于 32.3 的所有行
q "select count(*) from ./clicks_file.csv where c3 > 32.3"
# 產(chǎn)看當(dāng)前目錄的 png 文件總共占用了多少空間
ps -ef | q -H "select UID, count(*) cnt from - group by UID order by cnt desc limit 3"
參考鏈接:
安裝
在 Mac 下可以直接使用brew install q
來安裝册着。
通用的一個(gè)簡(jiǎn)單方式是直接下載可執(zhí)行文件拴孤,整個(gè)q是一個(gè)包含1600行左右代碼的Python腳本。下載后賦予執(zhí)行權(quán)限甲捏,放進(jìn)系統(tǒng)路徑就行了演熟。
wget https://cdn.rawgit.com/harelba/q/1.5.0/bin/q
sudo cp q /usr/local/bin
更詳細(xì)的各平臺(tái)安裝方法請(qǐng)參考:http://harelba.github.io/q/install.html。
使用方法和示例
查看幫助
q -h
常用參數(shù)
-
-H
: 指定第一行為列名司顿,如未指定則使用 c1, c2 等作為列名 -
-t
: 指定分隔符為制表符(Tab)芒粹,其它分隔符可以使用-d
指定 -
-O
: 輸出中保留列名
示例
以下示例均來自官方教程,更多示例可自行前往參考:http://harelba.github.io/q/examples.html大溜。
示例5:從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)
計(jì)算/tmp
路徑下各用戶/組所屬的文件大小總和(單位為MB)
sudo find /tmp -ls | q "SELECT c5,c6,sum(c7)/1024.0/1024 AS total FROM - GROUP BY c5,c6 ORDER BY total desc"
輸出:
mapred hadoop 304.00390625
root root 8.0431451797485
smith smith 4.34389972687
示例6:通過指定標(biāo)題行獲取列名
計(jì)算進(jìn)程數(shù)最多的3個(gè)用戶化漆,按進(jìn)程數(shù)量降序排列。
注意-H
參數(shù)指定了第一行為列名猎提,所以索引的時(shí)候可以直接引用UID
获三。
ps -ef | q -H "SELECT UID,COUNT(*) cnt FROM - GROUP BY UID ORDER BY cnt DESC LIMIT 3"
輸出
root 152
harel 119
avahi 2
注:Mac 下結(jié)果樣式可能稍有差別旁蔼,UID列不是名字而是數(shù)字,這是由于 ps 命令在 Linux 和 FreeBSD 表現(xiàn)不同造成的疙教。
示例7:關(guān)聯(lián)兩個(gè)文件
下列命令將一個(gè) ls 命令輸出(exampledatafile)和一個(gè)包含組名棺聊、email 的文件(group-emails-example)進(jìn)行了關(guān)聯(lián)操作。
為了輸出的簡(jiǎn)潔性贞谓,還用了一個(gè) where 語句過濾除了叫 ppp 的文件限佩。
q "SELECT myfiles.c8,emails.c2 FROM exampledatafile myfiles JOIN group-emails-example emails ON (myfiles.c4 = emails.c1) WHERE myfiles.c8 = 'ppp'"
輸出:
ppp dip.1@otherdomain.com
ppp dip.2@otherdomain.com