原创:编码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介在Linux上分析文本文件时,一般会用到grep、sed、awk、sort、uniq等命令,但是这些命令有一定的学习成本,如果用SQL分析数据,会比较困难大多数后端用户。对于程序员来说,就简单多了。q命令就是这样一个工具,可以对空白的、逗号分隔的文本文件进行SQL操作,非常方便。install#ubuntu下安装$sudoaptinstallpython3-q-text-as-data#centos下下载安装包Install$wgethttps://github.com/harelba/q/releases/download/v3.1.6/q-text-as-data-3.1.6.x86_64.rpm$rpm-Uvhq-text-as-data-3.1.6.x86_64.rpm对于其他Linux发行版,可以参考官网安装文档:http:///harelba.github.io/q/#i….空格分隔文件的常见用法分析q默认将文本文件中的每一行视为一条数据,使用空格作为字段分隔符。假设有如下学生列表,想查询16岁以上学生的id和姓名,如下:$catstudents.txtidnameagesex1person11502person21503person31604person41605person51606person61717person71718person81719person918110person10181#查询16岁以上学生的id和姓名#-H:通知q命令第一行是标题行$q-H'selectid,namefromstudents.txtwhereage>16'6person67person78person89person910person10#-O可以在输出结果中有标题$q-H-O'selectid,namefromstudents.txtwhereage>16'idname6person67person78person89person910person10如果没有为header行,用c1,c2,c3...来引用字段,如下:$catstudents.txt1person11502person21503person31604person41605person51606person61717person71718person81719person918110person10181#查询16岁以上学生的id和姓名$q'selectc1,c2fromstudents.txtwherec3>16'6person67person78person89person910person10从标准输入读取数据q命令也可以直接从标准输入读取数据,使用-作为表名,如下:$catstudents.txt|q-H-O'select*from-limit2'idnameagesex1person11502person2150分析csv文件q命令默认使用空格作为分隔符,也可以通过-d指定分隔符,方便分析csv文件(,分隔)或tsv文件(\t分隔),如下:$catstudents.csvid,name,age,sex1,person1,15,02,person2,15,03,person3,16,04,person4,16,05,person5,16,06,person6,17,17,person7,17,18,person8,17,19,person9,18,110,person10,18,1#-d:指定分隔符$q-H-d,'selectcount(*)fromstudents.csvwhereage>16'5q命令还可以自动识别文件中的双引号",使得字段值中带有逗号的场景也可以很好办,如下:$catstudents.csvid,name,age,sex1,"person,lisi",15,02,"person,wangwu",15,03,person3,16,04,person4,16,05,person5,16,06,person6,17,17,person7,17,18,person8,17,19,person9,18,110,person10,18,1#q命令可以自动读取引用里面的数据marksintoafield$q-H-d,'select*fromstudents.csvwhereage=15'1,"person,lisi",15,02,"person,wangwu",15,0#awk没有这个机制,字段引用错位,导致queryLessdata$awk-F,'$3==15{print$0}'students.csvq命令也可以轻松处理最后一列带分隔符,如下:#psThelast带空格的命令输出列$ps1PIDTTYSTATTIMECOMMAND1?ss1:28/sbin/initautonoprompttext#如果你用awk,你会发现空格后面的部分不见了$ps1|awk'{print$5}'命令/sbin/init#q命令可以使用-c5来指定列数,这样最后一列就会被完全检出$ps1|q-H-O-c5'selectCOMMANDfrom-'COMMAND"/sbin/initautonoprompttext"多文件关联查询SQL中最强大的关联查询,也可以支持q命令,如下:$catuser.txtidname1zhangsan2lisi3wangwu4pangliu$catscore.txtidscore186257392$q-H'selectu.id,u.name,s.scorefromuser.txtuleftjoinscore.txtsonu.id=s.id'1zhangsan862lisi573wangwu924pangliu其他q命令使用内嵌数据库SQLite,运行时,q命令会在SQLite中创建临时数据库和表,向临时表中插入文本数据,然后执行SQL直接在临时表上声明。所以理论上只要是SQLite支持的SQL语法,q命令也都支持。可以通过-A查看临时表的表结构,如下:#只查看表结构,SQL不会真正执行$q-H-d,-A'select*fromstudents.csv'Tableforfile:students.csv`id`-int`name`-text`age`-int`sex`-int可以发现id、age、sex字段都是int类型,是通过文本数据自动解析出来的q命令。前几期的内容,原来awk真的是神器。Linux文本命令技巧(上)Linux文本命令技巧(下)字符编码谜题
