awk循环处理文本进行统计

由于awk对于标准格式文本可以快速分割,因此我有时候懒得用python再去写更长的脚本去做一些简单的统计和打印工作。

比如,现有文本为对一些符号的分类:

pre_groups:CH_DTL = z c s ì
pre_groups:CH_RTR = Z C S r î

用集合的语言来说,我希望,该分类满足:

1. 完备性:所有的元素必须属于某一个分类。

2. 唯一性:所有的元素仅能属于一个分类,而不是多个。


那么,我将使用awk进行快速统计,然后查看:

1. 每个元素是否只出现一次。

2. 所有出现的元素的个数与总元素个数是否相同。

awk可以帮我们第一点。


使用的命令为:

cat 1.txt | sed -r -e 's/^.*= //g' | sed -r -e 's/ $//g' | awk -f stat_phoneme.awk > phon_stat.log

其中,awk的文件内容为:

{for( i=1; i<= NF; i++) Number[$i]++ } 
END { for( phon in Number) printf("%-10s %d\n", phon, Number[phon] )} 

注意:

1. 如果文件的分割符不是默认的空格,那就用-F选项(不是-f)来指定一个或者多个符号作为分隔符,比如 -F"[,;]",表示逗号和冒号都是分割符,如果仅用逗号,则-F","

2. BEGIN和END后的语句仅执行一次,其中前者是在逐行处理输入之前进行,后者是在处理完每行输入之后进行。所以,如果把处理每行数据看做是个循环的话,那么BEGIN主要可以用来设置一下全局变量,而END则可以用来对处理结果进行统计分析和输出等。

3. NF:全局变量,表示每一行的字段的数目。$0表示该行的内容,$1表示该行第一个字段,以此类推。

4. Number[$1]:这是个类似于python的字典的东西,但是它其实是个数列,只是可以这样用而已。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值