用SQL分析文本文件如何分析电脑文件
原創(chuàng):打碼日記(微信公眾號ID:codelogs),歡迎分享,轉(zhuǎn)載請保留出處。
簡介
在Linux上分析文本文件時,一般會使用到grep、sed、awk、sort、uniq等命令,但這些命令都有一定的學(xué)習(xí)成本,而如果是用SQL來分析數(shù)據(jù)的話,這對廣大后端程序員來說,就要簡單很多了。
而q命令就是這樣一款工具,可以在空白、逗號分隔的文本文件上執(zhí)行SQL運(yùn)算,非常方便。
安裝
# 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發(fā)行版,可以參考官網(wǎng)安裝文檔:http://harelba.github.io/q/#installation。
常見用法
分析空白分隔文件
默認(rèn)情況下,q將文本文件中每一行當(dāng)作一條數(shù)據(jù),使用空白作為字段分隔符。
假設(shè)有如下學(xué)生列表,要查詢出大于16歲的學(xué)生的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歲的學(xué)生的id與姓名
# -H : 告知q命令第一行是標(biāo)題行
$ q -H 'select id,name from students.txt where age>16'
6 person6
7 person7
8 person8
9 person9
10 person10
# -O可使輸出結(jié)果中帶有標(biā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
如果文件中沒有標(biāo)題行的話,可使用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歲的學(xué)生的id與姓名
$ q 'select c1,c2 from students.txt where c3>16'
6 person6
7 person7
8 person8
9 person9
10 person10
從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)
q命令也可直接從標(biāo)準(zhǔn)輸入中讀取數(shù)據(jù),使用-作為表名即可,如下:
$ cat students.txt | q -H -O 'select * from - limit 2'
id name age sex
1 person1 15 0
2 person2 15 0
分析csv文件
q命令默認(rèn)使用空白作為分隔符,但也可以通過-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命令可自動將引號內(nèi)數(shù)據(jù)讀取成一個字段
$ q -H -d, 'select * from students.csv where age=15'
1,"person,lisi",15,0
2,"person,wangwu",15,0
# awk沒有這種機(jī)制,字段引用錯位,導(dǎo)致查不到數(shù)據(jù)
$ 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,會發(fā)現(xiàn)漏掉了空格后的部分
$ ps 1 | awk '{print $5}'
COMMAND
/sbin/init
# q命令可使用-c 5指定列數(shù)量,這樣最后一列就完整查出來了
$ ps 1 | q -H -O -c 5 'select COMMAND from -'
COMMAND
"/sbin/init auto noprompt text"
多文件關(guān)聯(lián)查詢
SQL中最強(qiáng)大的關(guān)聯(lián)查詢,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這個嵌入式數(shù)據(jù)庫,運(yùn)行過程中,q命令會在SQLite中創(chuàng)建臨時數(shù)據(jù)庫與表,并將文本數(shù)據(jù)插入到臨時表中,然后SQL語句直接執(zhí)行在這個臨時表上。
所以理論上,只要是SQLite支持的SQL語法,q命令也支持。
可以通過-A查看臨時表的表結(jié)構(gòu),如下:
# 僅查看表結(jié)構(gòu),SQL實(shí)際不會執(zhí)行
$ q -H -d, -A 'select * from students.csv'
Table for file: students.csv
`id` - int
`name` - text
`age` - int
`sex` - int
可以發(fā)現(xiàn),id、age與sex字段都是int類型,這是q命令自動從文本數(shù)據(jù)中分析出來的。
總結(jié)
以上是生活随笔為你收集整理的用SQL分析文本文件如何分析电脑文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java访问器_ONGN和java字段访
- 下一篇: 电脑如何快速投影到盒子或电视上看视频电脑