q命令-用SQL分析文本文件
2022/3/27 2:22:36
本文主要是介绍q命令-用SQL分析文本文件,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
原创:打码日记(微信公众号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/#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
可以发现,id
、age
与sex
字段都是int类型,这是q命令自动从文本数据中分析出来的。
往期内容
原来awk真是神器啊
Linux文本命令技巧(上)
Linux文本命令技巧(下)
字符编码解惑
这篇关于q命令-用SQL分析文本文件的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23JAVA语音识别项目入门教程
- 2024-11-23Java云原生学习:从入门到实践
- 2024-11-22Java创业学习:初学者的全面指南
- 2024-11-22JAVA创业学习:零基础入门到实战应用教程
- 2024-11-22Java创业学习:从零开始的Java编程入门教程
- 2024-11-22Java对接阿里云智能语音服务学习教程
- 2024-11-22JAVA对接阿里云智能语音服务学习教程
- 2024-11-22Java对接阿里云智能语音服务学习教程
- 2024-11-22Java副业学习:零基础入门到实战项目
- 2024-11-22Java副业学习:零基础入门指南