下文中设计的变量
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 |
---|---|
101 | 001 |
101 | 002 |
102 | 001 |
101 | 005 |
统计的结果为:
商家 | 活跃用户数 |
---|---|
101 | 2 |
102 | 1 |
(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