2025年3月25日 星期二 甲辰(龙)年 月廿四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 软件应用 > 其它软件

q命令-用SQL分析文本文件

时间:01-27来源:作者:点击数:63

简介#

在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/#installation。

常见用法#

分析空白分隔文件#

默认情况下,q将文本文件中每一行当作一条数据,使用空白作为字段分隔符。

假设有如下学生列表,要查询出大于16岁的学生的id与姓名,如下:

  • $ cat students.txt
  • id name age sex
  • 1 person1 15 0
  • 2 person2 15 0
  • 3 person3 16 0
  • 4 person4 16 0
  • 5 person5 16 0
  • 6 person6 17 1
  • 7 person7 17 1
  • 8 person8 17 1
  • 9 person9 18 1
  • 10 person10 18 1
  • # 查询出大于16岁的学生的id与姓名
  • # -H : 告知q命令第一行是标题行
  • $ q -H 'select id,name from students.txt where age>16'
  • 6 person6
  • 7 person7
  • 8 person8
  • 9 person9
  • 10 person10
  • # -O可使输出结果中带有标题
  • $ q -H -O 'select id,name from students.txt where age>16'
  • id name
  • 6 person6
  • 7 person7
  • 8 person8
  • 9 person9
  • 10 person10

如果文件中没有标题行的话,可使用c1、c2、c3...来引用字段,如下:

  • $ cat students.txt
  • 1 person1 15 0
  • 2 person2 15 0
  • 3 person3 16 0
  • 4 person4 16 0
  • 5 person5 16 0
  • 6 person6 17 1
  • 7 person7 17 1
  • 8 person8 17 1
  • 9 person9 18 1
  • 10 person10 18 1
  • # 查询出大于16岁的学生的id与姓名
  • $ q 'select c1,c2 from students.txt where c3>16'
  • 6 person6
  • 7 person7
  • 8 person8
  • 9 person9
  • 10 person10

从标准输入读取数据#

q命令也可直接从标准输入中读取数据,使用-作为表名即可,如下:

  • $ cat students.txt | q -H -O 'select * from - limit 2'
  • id name age sex
  • 1 person1 15 0
  • 2 person2 15 0

分析csv文件#

q命令默认使用空白作为分隔符,但也可以通过-d指定分隔符,这样可以很容易地分析csv文件(,分隔)或tsv文件(\t分隔),如下:

  • $ cat students.csv
  • id,name,age,sex
  • 1,person1,15,0
  • 2,person2,15,0
  • 3,person3,16,0
  • 4,person4,16,0
  • 5,person5,16,0
  • 6,person6,17,1
  • 7,person7,17,1
  • 8,person8,17,1
  • 9,person9,18,1
  • 10,person10,18,1
  • # -d : 指定分隔符
  • $ q -H -d, 'select count(*) from students.csv where age>16'
  • 5

q命令还可以自动识别文件中的双引号",这使得字段值中带有逗号的场景也可以很容易处理,如下:

  • $ cat students.csv
  • id,name,age,sex
  • 1,"person,lisi",15,0
  • 2,"person,wangwu",15,0
  • 3,person3,16,0
  • 4,person4,16,0
  • 5,person5,16,0
  • 6,person6,17,1
  • 7,person7,17,1
  • 8,person8,17,1
  • 9,person9,18,1
  • 10,person10,18,1
  • # q命令可自动将引号内数据读取成一个字段
  • $ q -H -d, 'select * from students.csv where age=15'
  • 1,"person,lisi",15,0
  • 2,"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.txt
  • id name
  • 1 zhangsan
  • 2 lisi
  • 3 wangwu
  • 4 pangliu
  • $ cat score.txt
  • id score
  • 1 86
  • 2 57
  • 3 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 86
  • 2 lisi 57
  • 3 wangwu 92
  • 4 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

可以发现,idagesex字段都是int类型,这是q命令自动从文本数据中分析出来的。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门