awk结合正则匹配

利用awk分析data.csv中label列各取值的分布.

在终端执行head data.csv查看数据:

1 name,business,label,label_name
2 沧州光松房屋拆迁有限公司,旧房拆迁、改造;物业服务(依法须经批准的项目,经相关部门批准后方可开展经营活动),E4,建筑装饰和其他建筑业
3 上海托帕化工材料有限公司,"从事化工材料领域内的技术开发、技术转让、技术咨询、技术服务、化工原材料及产品(除危险化学品、监控化学品、烟花爆竹、易制毒化学品、民用爆炸物品)、机械设备、电子产品、橡塑制品、机电设备、五金建材、日用百货的销售,从事货物及技术的进出口业务。
4 【依法须经批准的项目,经相关部门批准后方可开展经营活动】",F2,零售业
5 上海利昂节能灯具有限公司,节能灯管,节能灯配件,电子镇流器,灯具,电子产品,生产,加工,C26,电气机械和器材制造业
6 裕福支付有限公司海南分公司,"企业管理咨询,计算机数据处理,应用软件技术服务,会议服务,经济信息咨询",L2,商务服务业
7 龙川县联生农贸市场管理中心,自建农贸市场管理服务,L2,商务服务业

 

因为行内包含换行符的项会被分成多行(例如上面的第3,4行),所以需要结合正则匹配

cat data.csv | awk -F ',' '{if(NF>2 && $(NF-1)~/^[A-Z][0-9]/) {print $(NF-1)}}' | sort | uniq -c | sort -n -r > label_distribution.txt

-F ',' 表示根据逗号分隔;

$(NF-1)~/^[A-Z][0-9]/ 表示分隔后的倒数第二项(在此指取label列的值)需满足指定的正则匹配规则

 

另外,利用Pandas库对csv格式的文件做统计也很方便.

用pandas读取数据:

awk结合正则匹配_第1张图片

 

print df.label.value_counts()
"""
F1     622844
L2     614734
F2     493420
A1     102186
...
"""

value_counts()方法统计序列所有元素出现次数,并进行倒序.

 

转载于:https://www.cnblogs.com/bymo/p/7246353.html

你可能感兴趣的:(awk,shell,python)