有趣生活

当前位置:首页>科技>数据分析写sql在哪写q命令-用SQL分析文本文件

数据分析写sql在哪写q命令-用SQL分析文本文件

发布时间:2026-07-20阅读(1)

导读原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处,接下来我们就来聊聊关于数据分析写sql在哪写?以下内容大家不妨参考一二希望能帮....

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处,接下来我们就来聊聊关于数据分析写sql在哪写?以下内容大家不妨参考一二希望能帮到您!

数据分析写sql在哪写(q命令-用SQL分析文本文件)

数据分析写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.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>166 person67 person78 person89 person910 person10# -O可使输出结果中带有标题$ q -H -O select id,name from students.txt where age>16id 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>166 person67 person78 person89 person910 person10

从标准输入读取数据

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

$ cat students.txt | q -H -O select * from - limit 2id 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>165

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=151,"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.id1 zhangsan 862 lisi 573 wangwu 924 pangliu

其它

q命令使用了SQLite这个嵌入式数据库,运行过程中,q命令会在SQLite中创建临时数据库与表,并将文本数据插入到临时表中,然后SQL语句直接执行在这个临时表上。

所以理论上,只要是SQLite支持的SQL语法,q命令也支持。

可以通过-A查看临时表的表结构,如下:

# 仅查看表结构,SQL实际不会执行$ q -H -d, -A select * from students.csvTable for file: students.csv `id` - int `name` - text `age` - int `sex` - int

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

Copyright © 2024 有趣生活 All Rights Reserve吉ICP备19000289号-5 TXT地图HTML地图XML地图