
旧文一篇特作整理发布。为了做轻量级数据分析不希望通过pandas 这种比较重的框架可以利用Shell 。awk—SELECTsed—UPDATE/REPLACEgrep—WHEREcut—COLUMN投影sort—ORDER BYuniq—GROUP BY需配合sortwc—COUNThead/tail—LIMITjoin—JOIN多文件关联tr—类型转换/清洗xargs—子查询或参数化执行。本文以“Shell即SQL” 框架示例如何使用Shell 命令分析结构化文本数据无需启动Python或数据库。把每条命令看作关系代数算子管道|则是将算子串联的流式执行引擎。例如# 类比SELECT status, COUNT(*) FROM access.log GROUP BY status ORDER BY COUNT(*) DESC LIMIT 5awk{print $9}access.log|sort|uniq-c|sort-nr|head-5核心在于把每条命令看作关系代数算子管道|即自然连接NATURAL JOIN的流式执行引擎。熟练后Shell 不再是“胶水语言”而是轻量、实时、可复现的数据分析DSL。Select--select$1,$3from table(列投影)awk{print $1, $3}file.txt -- 或者使用cutcut-f1,3file.txtWheregrep的本质是行过滤Where。--select* from table where col12(精确匹配)awk$1 2 {print $0}file.txt -- 长度36awk{if(length($0) 36) print $0}--select* from table where col2 like%车载%(模糊匹配)grep-E车载file.txtOrdersort命令提供了丰富的排序功能。-t指定文件行分隔符sort-t$\t-k指定排序的key可设置key起始与截止作为组合key同时也可以指定多keysort-k3sort-k3.3,3.5sort-k1,2-k3,3nr其中-k 3表示的是比较从第三列第三个字段开始到行尾而不是单单第三列3.3、3.5表示第三列的第3个字符、第5个字符.-n表示数值排序numeric sort-h表示human-numeric-sort比如“2K”、1G等排序-r表示逆序。sort命令默认数字排在字母前面字母遵从字母表的顺序即顺词典序小写字母排在大写字母前面Group--select$1, count(*)group by$1awk{arr[$1]} END {for(a in arr) print a, arr[a]}--select$2, sum($5)group by$2awk{a[$2]$5} END {for(i in a) printf %s %10.3f\n, i, a[i]}--select$2, sum($5), sum($6)group by$2awk{a[$2]$5; b[$2]$6} END {for(i in a) printf %s %10.3f %14.3f\n, i, a[i], b[i]}--select$2,$3, sum($5)group by$2,$3awk{a[$2 $3]$5} END {for(i in a) printf %s %10.3f\n, i, a[i]}--select$2,$3, sum($5), sum($6)group by$2,$3awk{a[$2 $3]$5; b[$2 $3]$6} END {for(i in a) printf %s %14.3f %14.3f\n, i, a[i], b[i]}Distinct--selectdistinct * from tablesortfile_path|uniqCountcount一般配合group使用SQL 里经常有不带 group 的 select count(*) from table利用 wc -l 可以极快地实现。-- select count(*) from table wc -l file_pathLimit / Offsetawk-- 选中某些行awkNR33 NR38 {print}-- 添加列值awkNR5 {c电脑; print c, $3}UDF集合函数常见的集合操作如并集、交集、差集实现如下-- a union bcata b|sort|uniqa_b.union -- a intersect bcata b|sort|uniq-da_b.intersect -- adiffbcata_b.union b|sort|uniq-ua_b.diff其中uniq命令的-d参数表示只打印相邻重复的行。String函数awk命令内置许多string函数接下来将类比于MySQl语法展开awk的string函数的使用。--splitawk-F\001NR5 {print $1}-- likeawk-F\t{if(!match($2, .*(上证指数)|(创客).*)) print $0}-- regex_extractecho{(智能,智能语音)}|awk-F\tmatch($0, /(\w)\)\}/, arr) {print arr[1]}-- containsecho盛(土康)|awk$0 ~ /\(/ {print $0}-- 打乱文件按行数进行分割shufall_id.txt|split-l100000