Linux中操作文件的SQL利器

背景:

平常再使用Linux过程中,大家可能对tailheadcatsedmoreless这些经典系统命令,或者awk这类三方数据过滤工具都不陌生,配合起来查询效率很高。但往往使用过程中命令参数过多,可能就比较让人头疼。

今天分享的工具q,就实现了以写SQL的方式来查询、统计文本内容,一起来看看:

介绍:

q是一个命令行工具,它允许在csv/tsv(以及任何其他表格文本文件)上直接执行类似SQL的查询。它的目的是为Linux命令行带来SQL表达能力,并提供对文本作为实际数据的轻松访问。

q将普通文件视为数据库表,支持WHERE、GROUP BY、JOINs等所有SQL结构,支持自动列名和列类型检测,完全支持多种编码。

官方网站:http://harelba.github.io/q/

q "SELECT COUNT(*) FROM ./clicks_file.csv WHERE c3 > 32.3"

ps -ef | q -H "SELECT UID,COUNT(*) cnt FROM - GROUP BY UID ORDER BY cnt DESC LIMIT 3" 

下载及安装:

[root@localhost java]# wget https://github.com/harelba/q/releases/download/2.0.19/q-text-as-data-2.0.19-1.x86_64.rpm

[root@localhost java]# rpm -ivh q-text-as-data-2.0.19-1.x86_64.rpm 

 

 [root@localhost java]# q --version     # 查看安装版本

 语法:

q支持所有SQLiteSQL语法,标准命令行格式  q + 参数命令 + "SQL"

 q <命令> "<SQL>"

q <flags> "<query>"  Simplest execution is `q "SELECT * FROM myfile"` which prints the entire file.

查询test.txt文件内容:

[root@localhost testDir]# q "select * from test.txt"
 

q不附加参数使用是可以的,但利用参数会让显示结果更加美观,这里它的参数分为 2种:

input输入命令:指的是对要查询的文件或结果集进行操作,比如:-H命令,表示输入的数据包含标题行。

[root@localhost testDir]# q -H "select * from test.txt"

在这种情况下,将自动检测列名,并可在查询语句中使用。

如果未提供此选项,则列将自动命名为cX,以c1起始以此类推。

[root@localhost testDir]# q "select c1,c2 from test.txt"

output输出命令:作用在查询输出的结果集,如:-O,让查询出来的结果显示列名。

[root@localhost testDir]# q -H "select count(c1) from test.txt"
[root@localhost testDir]# q -H -O "select count(c1) from test.txt"

 

查询是类似SQL的查询,其中包含文件名而不是表名。查询本身应作为工具的一个参数提供(即用引号括起来)。可以将多个文件用作一个表,方法是将它们写入文件名1文件名2。。。或者使用shell通配符(例如:usr\file*.csv ). 

[root@localhost testDir]# cp test.txt test2.txt

还有其他场景就不列举了,可以通过help命令查看 或者通过查阅官网说明:

https://harelba.github.io/q 或者 http://www.sqlite.org/lang.html(SQL语法本身就是sqlite的语法)

 [root@localhost testDir]# q -help

SQL查询:

q得到的每个参数都是一个完整的SQL查询。所有查询都会一个接一个地执行,并将结果输出到标准输出。请注意,数据加载只完成一次,因此当在同一命令行上传递多个查询时,只有第一个查询需要很长时间。其余的将几乎立即开始运行,因为所有的数据都已经加载。请记住对每个查询使用双引号—每个参数都是一个完整的SQL查询。允许使用任何标准的SQL表达式、条件(WHERE和HAVING)、groupby、ORDER BY等。WHERE子句支持联接和子查询,但现在FROM子句中不支持,执行联接时使用表别名。

等值查询:

[root@localhost testDir]# q -H "select * from test.txt where c1 = 'hello'"

关键字检索,用grep命令是全文检索,q 并没有什么优势,因为它查询时必须指定某一列。

[root@localhost testDir]# cat test.txt | grep 'o' 

模糊查询:

[root@localhost testDir]# q -H "select * from test.txt where c1 like '%o%'"

尝试了下将查询结果集写入文件中也是ok的 

[root@localhost testDir]# q -H "select * from test.txt where c1 like '%o%'" >> test0721.txt 

 

取并集 

[root@localhost testDir]# q "select * from test.txt union select * from test2.txt"

数据统计:

[root@localhost testDir]# q -H "select c1,count(1) cnt  from test.txt group by c1 order by cnt desc limit 2"

取多个文件:

 [root@localhost testDir]# q "select * from test*.txt"

多表联查:

[root@localhost testDir]# q -H "select a.* from test.txt a join test3.txt b on a.c1 = b.c1"

总结:

可能觉得q的这些功能awk直接可以使用的,但是awk话说还是有一定门槛的,SQL的话相对对于开发来说上手都是比较容易的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值