https://www.cnblogs.com/codelogs/p/16060830.html

简介#

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

往期内容#

原来awk真是神器啊
Linux文本命令技巧(上)
Linux文本命令技巧(下)
字符编码解惑

[转帖] q命令-用SQL分析文本文件的更多相关文章

  1. 品味性能之道<六>:图形化SQL分析工具

         在上一章里,重点分享了命令行SQL分析工具的使用方法.在本章将重点分享PL/SQL的SQL分析工具. 一.如何打开PL/SQL执行计划      开启PL/SQL这工具,推荐如下方法: 点击 ...

  2. MySQL命令执行sql文件的两种方法

    MySQL命令执行sql文件的两种方法 摘要:和其他数据库一样,MySQL也提供了命令执行sql脚本文件,方便地进行数据库.表以及数据等各种操作.下面笔者讲解MySQL执行sql文件命令的两种方法,希 ...

  3. MySQL SQL分析(SQL profile)

    分析SQL优化运营开销SQL的重要手段.在MySQL数据库.可配置profiling参数启用SQL分析.此参数可以在全局和session水平集.级别则作用于整个MySQL实例,而session级别紧影 ...

  4. TiDB show processlist命令源码分析

    背景 因为丰巢自去年年底开始在推送平台上尝试了TiDB,最近又要将承接丰巢所有交易的支付平台切到TiDB上.我本人一直没有抽出时间对TiDB的源码进行学习,最近准备开始一系列的学习和分享.由于我本人没 ...

  5. Mysql常用命令大全 sql

    1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...

  6. 品味性能之道<五>:SQL分析工具

    一.SQL语句到底是怎么执行的? 想了解SQL语句到底是怎么执行的,那就需要进行SQL语句执行计划分析. 那什么是SQL语句执行计划呢? 就是Oracle服务器执行SQL语句的过程.例如确定是否使用索 ...

  7. Linux就该这么学--命令集合3(文本文件编辑命令)

    1.cat命令查看纯文本文件(较短):(cat [选项] [文件]) cat -n showpath.sh 附录: -n 显示行号 -b 显示行号(不包括空行) -A 显示出“不可见”的符号,如空格, ...

  8. MySQL的EXPLAIN命令用于SQL语句的查询执行计划

    MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息 ...

  9. 一个使用C#的TPL Dataflow Library的例子:分析文本文件中词频

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:一个使用C#的TPL Dataflow Library的例子:分析文本文件中词频.

  10. memcached学习笔记——存储命令源码分析下篇

    上一篇回顾:<memcached学习笔记——存储命令源码分析上篇>通过分析memcached的存储命令源码的过程,了解了memcached如何解析文本命令和mencached的内存管理机制 ...

随机推荐

  1. CSS 基础 1 - Block & Inline

    CSS 基础 1 - Block & Inline display: inline/block/inline-block/none/flex/grid; block block 元素独占一行, ...

  2. .Net 系列:Attribute特性的高级使用及自定义验证实现

    一.特性是什么?特性有什么用? 特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签. 您可以通过使用特性向程序添加声明性信息.一个声明 ...

  3. 神经网络基础篇:详解logistic 损失函数(Explanation of logistic regression cost function)

    详解 logistic 损失函数 在本篇博客中,将给出一个简洁的证明来说明逻辑回归的损失函数为什么是这种形式. 回想一下,在逻辑回归中,需要预测的结果\(\hat{y}\),可以表示为\(\hat{y ...

  4. 能够让机器狗学会灭火, ModelArts3.0让AI离我们又近一步

    摘要:训练.标注成本节省90%!华为云自动化AI开发平台ModelArts 3.0发布,从训练数据到模型落地一站式打通. 今年的华为,着实遭遇了不小的困难. 尤其是供应链,包括芯片方面的打击,让华为轮 ...

  5. 详解Apache Sentry->Ranger平滑升级方案

    摘要:本文主要探讨如何平滑解决sentry到ranger升级过程中的权限迁移问题. 本文分享自华为云社区<[平滑上云]Apache Sentry->Ranger平滑升级方案>,作者: ...

  6. Error: Could not find or load main class org.elasticsearch.tools.java_version_checker.JavaVersionChecker

    把elasticsearch目录换到不属于root目录的其他目录就行了

  7. 从下个月开始,App Store 要求使用 Xcode 14 构建的 iOS 16 兼容应用程序

    Xcode 继向开发者发布第一个iOS 16.5 测试版后,苹果公司周二宣布了对开发者向 App Store 提交应用程序的新要求.从下个月开始,Apple 将要求每个应用程序都必须使用 Xcode ...

  8. ME51N 采购申请屏幕增强仅显示字段

    1.业务需求 通过委外工单生成的采购申请,需要将自定义"图号"字段显示在采购申请中,且只用于显示即可 2.增强实现 增强表EBAN的结构CI_EBANDB 增强点CMOD:MERE ...

  9. POJ:3279-Fliptile【状态压缩】【DFS】

    POJ-3279 经典[状态压缩][DFS]题型 题目大意:有一个 M * N 的格子,每个格子可以翻转正反面,它们有一面是黑色,另一面是白色.黑色翻转之后变成白色,白色翻转之后则变成黑色. 游戏要做 ...

  10. 通过Navicate for MySQL导入SQL文件

    本文介绍通过Navicate for MySQL导入SQL文件的方法. 前提条件 已安装Navicat for MySQL 和 MySql.您可以前往 Navicat官网 下载Navicat for ...