原创:打码日记(微信公众号ID:codelogs),欢送分享,转载请保留出处。
简介
在Linux上剖析文本文件时,个别会应用到grep、sed、awk、sort、uniq等命令,但这些命令都有肯定的学习老本,而如果是用SQL来剖析数据的话,这对宽广后端程序员来说,就要简略很多了。
而q命令就是这样一款工具,能够在空白、逗号分隔的文本文件上执行SQL运算,十分不便。
装置
# ubuntu下装置$ sudo apt install python3-q-text-as-data# centos下可下载安装包装置$ wget https://github.com/harelba/q/releases/download/v3.1.6/q-text-as-data-3.1.6.x86_64.rpm$ rpm -Uvh q-text-as-data-3.1.6.x86_64.rpm
如果是其它Linux发行版,能够参考官网装置文档:http://harelba.github.io/q/#i...。
常见用法
剖析空白分隔文件
默认状况下,q将文本文件中每一行当作一条数据,应用空白作为字段分隔符。
假如有如下学生列表,要查问出大于16岁的学生的id与姓名,如下:
$ cat students.txtid 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# 查问出大于16岁的学生的id与姓名# -H : 告知q命令第一行是题目行$ q -H 'select id,name from students.txt where age>16'6 person67 person78 person89 person910 person10# -O可使输入后果中带有题目$ q -H -O 'select id,name from students.txt where age>16'id name6 person67 person78 person89 person910 person10
如果文件中没有题目行的话,可应用c1、c2、c3...
来援用字段,如下:
$ cat students.txt1 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# 查问出大于16岁的学生的id与姓名$ q 'select c1,c2 from students.txt where c3>16'6 person67 person78 person89 person910 person10
从规范输出读取数据
q命令也可间接从规范输出中读取数据,应用-
作为表名即可,如下:
$ cat students.txt | q -H -O 'select * from - limit 2'id name age sex1 person1 15 02 person2 15 0
剖析csv文件
q命令默认应用空白作为分隔符,但也能够通过-d
指定分隔符,这样能够很容易地剖析csv文件(,
分隔)或tsv文件(\t
分隔),如下:
$ cat students.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, 'select count(*) from students.csv where age>16'5
q命令还能够自动识别文件中的双引号"
,这使得字段值中带有逗号的场景也能够很容易解决,如下:
$ cat students.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命令可主动将引号内数据读取成一个字段$ q -H -d, 'select * from students.csv where age=15'1,"person,lisi",15,02,"person,wangwu",15,0# awk没有这种机制,字段援用错位,导致查不到数据$ awk -F, '$3==15{print $0}' students.csv
q命令也能够很容易地解决最初一列带分隔符的场景,如下:
# ps输入的最初一列COMMAND带有空格$ ps 1 PID TTY STAT TIME COMMAND 1 ? Ss 1:28 /sbin/init auto noprompt text# 如果用awk,会发现漏掉了空格后的局部$ ps 1 | awk '{print $5}'COMMAND/sbin/init# q命令可应用-c 5指定列数量,这样最初一列就残缺查出来了$ ps 1 | q -H -O -c 5 'select COMMAND from -'COMMAND"/sbin/init auto noprompt text"
多文件关联查问
SQL中最弱小的关联查问,q命令也是能够反对的,如下:
$ cat user.txtid name1 zhangsan2 lisi3 wangwu4 pangliu$ cat score.txtid score1 862 573 92$ q -H 'select u.id,u.name,s.score from user.txt u left join score.txt s on u.id=s.id'1 zhangsan 862 lisi 573 wangwu 924 pangliu
其它
q命令应用了SQLite这个嵌入式数据库,运行过程中,q命令会在SQLite中创立长期数据库与表,并将文本数据插入到长期表中,而后SQL语句间接执行在这个长期表上。
所以实践上,只有是SQLite反对的SQL语法,q命令也反对。
能够通过-A
查看长期表的表构造,如下:
# 仅查看表构造,SQL理论不会执行$ q -H -d, -A 'select * from students.csv'Table for file: students.csv `id` - int `name` - text `age` - int `sex` - int
能够发现,id
、age
与sex
字段都是int类型,这是q命令主动从文本数据中剖析进去的。
往期内容
原来awk真是神器啊
Linux文本命令技巧(上)
Linux文本命令技巧(下)
字符编码解惑