awk 过滤文本 分类汇总

1 篇文章 0 订阅

下文中设计的变量

allDatas="allDatas.txt"
resultDatas="resultDatas.txt"

(1)去重,将重复的行去掉

awk '!arr[$0]++ {print $0}' ${allDatas} > temp.txt

补充: 去重的原理: array[$0]为空,但array[$0]++会先把array[$0]初始化为0,此时if(array[$0])等价于if(0),为false,取反后if (!array[$0]) 为true,再执行array[$0]++,array[$0]值变为1。之后相同$0对应的array[$0]都大于0,!array[$0]都为0,因此if(!array[$0]) 都为false,达到去重的效果。

举个例子说明原理。对于一个temp文件:

>less temp.txt
11111
11111
1212
15468

>awk '{print(array[$0],"*");if(array[$0]++){print (array[$0],$0)}else{print (array[$0],$0,"bad")}}' temp.txt
 *
1 11111 bad
1 *
2 11111
 *
1 1212 bad
 *
1 15468 bad

(2)按第一列的值分类,统计第一列的值出现的次数

awk '!arr[$1]++ {printf $1" ";system("grep "$1" temp.txt | wc -l")}' temp.txt > ${resultDatas}   

#删除临时文档

rm -f temp.txt

作用:例如,统计商家每月的活跃用户数(每月有多少用户用了这个商家的产品)

商家ID用户ID
101001
101002
102001
101005

统计的结果为:

商家活跃用户数
1012
1021

(3)统计每一行($0)出现的次数

awk '{array[$0]++}END{for(i in array){print (i,array[i])}}' result.txt > resultUserInfos.txt

(4)双文件求交集

awk 'NR==FNR{a[$1]=0} NR>FNR {if($1 in a){print $0}}' source01.txt source02.txt > result.txt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值