[转帖] q命令-用SQL分析文本文件

命令,sql,分析,文本文件 · 浏览次数 : 0

小编点评

**q命令简介** q命令是一种用于在空白、逗号分隔的文本文件上执行SQL运算的工具。它非常方便,因为它可以从标准输入中读取数据,并且可以自动识别文件中的双引号\"。 **安装** 在ubuntu下,可以使用以下命令安装q命令: ```bash sudo apt install python3-q-text-as-data ``` 在centos下,可以使用以下命令安装q命令: ```bash 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 ``` **常见用法** 以下是一些常见用法: * 分析空白分隔文件: ```bash q -H : 告知q命令第一行是标题行 q -H 'select id,name from students.txt where age>16'6 person67 person78 person89 person910 person10 ``` * 查询大于16岁的学生id与姓名: ```bash q -H 'select id,name from students.txt where age>16'id name6 person67 person78 person89 person910 person10 ``` * 从CSV文件中读取数据: ```bash q -H -d, 'select * from students.csv where age>16'5 ``` **其他** * q命令也可以使用-A查看临时表的表结构。 ```bash q -H -d, -A 'select * from students.csv'Table for file: students.csv `id` - int `name` - text `age` - int `sex` - int ```

正文

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分析文本文件相似的内容:

[转帖] q命令-用SQL分析文本文件

https://www.cnblogs.com/codelogs/p/16060830.html 原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介# 在Linux上分析文本文件时,一般会使用到grep、sed、awk、sort、uniq等命令,但这些命令都有一定的

[转帖] q命令-用SQL分析文本文件

https://www.cnblogs.com/codelogs/p/16060830.html 简介# 在Linux上分析文本文件时,一般会使用到grep、sed、awk、sort、uniq等命令,但这些命令都有一定的学习成本,而如果是用SQL来分析数据的话,这对广大后端程序员来说,就要简单很多了

[转帖]jmeter命令大全(命令行模式)

jmeter命令 --? 打印命令行选项并退出 -h、 --帮助 打印使用信息和退出 -v、 --版本 打印版本信息并退出 -p、 --propfile 要使用的jmeter属性文件 -q、 --addprop 其他JMeter属性文件 -t、 --测试文件<

[转帖]Linux统计/监控工具SAR详细介绍

原文链接: www.jiangxinlingdu.com Linux统计/监控工具SAR详细介绍:要判断一个系统瓶颈问题,有时需要几个 sar 命令选项结合起来使用,例如:怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看 怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sa

[转帖]全连接和半连接

https://www.jianshu.com/p/6a0fcb1008d6 参考 关于TCP 半连接队列和全连接队列 深入浅出TCP中的SYN-Cookies ss命令和Recv-Q和Send-Q状态 本文主要摘抄自关于TCP 半连接队列和全连接队列 1. TCP的全连接和半连接队列 当服务端调用

[转帖]ssh和scp配置

SSH="ssh -q -o MACs=umac-64@openssh.com -o StrictHostKeyChecking=no -o GSSAPIAuthentication=no -p"SCP="scp -q -o MACs=umac-64@openssh.com -o StrictHos

[转帖]一个故事看懂CPU的SIMD技术

https://www.cnblogs.com/xuanyuan/p/16048303.html 好久不见,我叫阿Q,是CPU一号车间的员工。我所在的CPU有8个车间,也就是8个核心,咱们每个核心都可以同时执行两个线程,就是8核16线程,那速度杠杠滴。 我所在的一号车间,除了负责执行指令的我,还有负

[转帖]公司架构师常常提起的DNS负载均衡是个什么鬼?

https://cloud.tencent.com/developer/article/2190719?areaSource=105001.2&traceId=7RuArY2Tm1MQWwQaMnx-Q 传统思路的局限性 CDN是怎么做的 你知道DNS是怎么工作的吗? 神奇的解释权机制(SOA) D

[转帖]Logback 配置文件这样优化,TPS提高 10 倍

https://cloud.tencent.com/developer/article/2045350?areaSource=105001.5&traceId=7RuArY2Tm1MQWwQaMnx-Q 01、通过阅读本篇文章将了解到 1.日志输出到文件并根据LEVEL级别将日志分类保存到不同文件

[转帖]7 种提升 Spring Boot 吞吐量神技!

https://cloud.tencent.com/developer/article/2045348?areaSource=105001.6&traceId=7RuArY2Tm1MQWwQaMnx-Q 一、异步执行 实现方式二种: 1、 使用异步注解@aysnc、启动类:添加@EnableAsyn