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

常见用法

默认情况下,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

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命令自动从文本数据中分析出来的。

往期内容

Original: https://www.cnblogs.com/codelogs/p/16060830.html
Author: 扣钉日记
Title: q命令-用SQL分析文本文件

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/714164/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 010 Linux 文本统计与去重 (wc 和 uniq)

    wc 命令一般是作为组合命令的一员与其他命令一同起到统计的作用。而一般情况下使用wc -l 命令较多。uniq 可检查文本文件中重复出现的行,一般与 sort 命令结合使用。一起组…

    技术杂谈 2023年7月10日
    089
  • SSA:终于知道编译器偷摸做了哪些事

    你好,我是轩脉刃。 在golang中,我们可以使用 go tool compile -S main.go 工具将一个go程序直接转换为汇编代码。但是你会发现,最终编译出来的汇编代码…

    技术杂谈 2023年6月1日
    067
  • 记录XorDDos木马清理步骤

    1.检查 查看定时任务文件发现有两个异常定时任务 [root@manage ~]# cat /etc/crontab user-name command to be execute…

    技术杂谈 2023年7月25日
    069
  • vnpy源码阅读学习(8):关于app

    关于app 在入口程序中,我们看到了把 gateway, app, 各类的 engine都添加到 mainEngine中来。不难猜测 gateway主要是处理跟外部的行情,接口各方…

    技术杂谈 2023年7月11日
    086
  • 获取当前程序的路径

    以下是获取当前程序路的代码:1 //该函数用于获取执行文件的目录,bExit为TRUE时判断获取的目录是否存在,缺省为TRUE 2 BOOL GetModuleFilePath(C…

    技术杂谈 2023年7月23日
    086
  • Jira Database schema

    https://developer.atlassian.com/server/jira/platform/database-schema/ https://developer.at…

    技术杂谈 2023年5月30日
    0108
  • APACHE正向代理配置

    Apache快速安装和反向代理配置:https://www.cnblogs.com/brad93/p/16718104.html Apache正向代理配置参考教程:https://…

    技术杂谈 2023年7月10日
    087
  • 搭建Rust开发环境

    介绍 Rust是一门系统编程语言,专注于安全,尤其是并发安全,支持函数式和命令式以及泛型等编程范式的多范式语言。 和Ruby,Python等脚本语言程序不同,Rust 是一种预编译…

    技术杂谈 2023年5月31日
    094
  • cmake:善用find_package()提高效率暨查找JNI支持

    cmake提供了很多实用的cmake-modules,通过find_package()命令调用这些modules,用于写CMakeLists.txt脚本时方便的查找依赖的库或其他编…

    技术杂谈 2023年5月30日
    095
  • JS——事件流与事件处理程序

    1.事件流:从页面中接收事件的顺序 1.1 IE :事件冒泡流1.2 Netscape :事件捕获1.3 DOM事件流 :事件捕获阶段——事件目标阶段——事件冒泡阶段DOM2级事件…

    技术杂谈 2023年5月31日
    086
  • Locationhttpd反向代理

    Location\httpd\反向代理 参考:http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_mod…

    技术杂谈 2023年7月11日
    058
  • MySQL的简单实用 手把手教学

    MySQL的使用 1.登陆数据库 打开terminal 在终端根文件目录下输入 /usr/local/mysql/bin/mysql -u root -p 接着输入管理员密码 2….

    技术杂谈 2023年7月25日
    075
  • 【转】RN报错汇总

    镜像不对,检查镜像是否为taobao的镜像, iOS 解决方式: 在Podfile中添加: …

    技术杂谈 2023年6月1日
    0103
  • Flink Time

    基础概念 支持三种时间概念: Processing Time 时间递增 Ingestion Time : 摄入时间,数据进入Flink框架的时间,在Source Operator中…

    技术杂谈 2023年7月10日
    063
  • 递归

    总结: 递归是一个思想,自己调用自己的一个过程 要点: 分析: 3.书写递归就是 ​ 找出什么时候不再 调用自己本身的条件 和 书写需要循环执行的代码 代码需要逻辑严密 4.注意事…

    技术杂谈 2023年6月21日
    097
  • select count(*)和select count(1)

    一般情况下,Select Count (*)和Select Count(1)两着返回结果是一样的 假如表沒有主键(Primary key), 那么count(1)比count(*)…

    技术杂谈 2023年5月31日
    0107
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球