[root@localhost ~]# cat 2_awk.txt #txt文档有三列数据
1 A 1
2 B 2
3 C 1
4 D 1
5 E 3
6 A 2
7 B 1
8 C 2
9 D 3
[root@localhost ~]# cat 2_awk.txt|awk '{print $1,$2}' #打印第一列和第二列
1 A
2 B
3 C
4 D
5 E
6 A
7 B
8 C
9 D
(1)统计ABCDE出现的次数
[root@localhost ~]# cat 2_awk.txt |awk '{a[$2]=a[$2]+1}END{for (i in a)print i,a[i]}'
A 2
B 2
C 2
D 2
E 1
或者
[root@localhost chenjianfeng]# cat 2_awk.txt |awk '{a[$2]+=1}END{for (i in a)print i,a[i]}'
A 2
B 2
C 2
D 2
E 1
分析:$2代表第二列;
pattern{ commands }语句块是从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕;
当读取第一行是a[A]=a[A]+1,a[A]默认初始值为0,所以此时a[A]=1;
当读取第二行是a[B]=a[B]+1,a[B]默认初始值为0,所以此时a[B]=1;
当读取第三行是a[C]=a[C]+1,a[C]默认初始值为0,所以此时a[C]=1;
当读取第四行是a[D]=a[D]+1,a[D]默认初始值为0,所以此时a[D]=1;
当读取第五行是a[E]=a[C]+1,a[E]默认初始值为0,所以此时a[E]=1;
当读取第六行是a[A]=a[A]+1,a[A]初始值已经变为1,所以此时a[A]=1+1,即a[A]=2;
当读取第七行是a[B]=a[B]+1,a[B]初始值已经变为1,所以此时a[B]=1+1,即a[B]=2;
当读取第八行是a[C]=a[C]+1,a[C]初始值已经变为1,所以此时a[C]=1+1,即a[C]=2;
当读取第九行是a[D]=a[C]+1,a[D]初始值已经变为1,所以此时a[D]=1+1,即a[D]=2;
END语句块在awk从输入流中读取完所有的行之后即被执行;
for (i in a) 读取数组的所有下标,即i分别等于A、B、C、D、E循环赋值
print i,a[i] 打印值
(2)第三列是等于3的,然后再按照第二列分组
分析:$3==3 是限制第三列等于3的行,这里要区别$3=3,$3=3是将第三列的值都变为3
[root@localhost ~]# cat 2_awk.txt|awk '$3==3 {a[$2]+=1} END{for (i in a) print i,a[i]}'
D 1
E 1
[root@localhost ~]# cat 2_awk.txt|awk '$3=3'
1 A 3
2 B 3
3 C 3
4 D 3
5 E 3
6 A 3
7 B 3
8 C 3
9 D 3
[root@localhost ~]# cat 2_awk.txt|awk '$3==3'
5 E 3
9 D 3
(3)按照第二列分组,计算第三列的总数
[root@localhost ~]# cat 2_awk.txt |awk '{a[$2]=a[$2]+$3}END{for (i in a)print i,a[i]}'
A 3
B 3
C 3
D 4
E 3
或者
[root@localhost ~]# cat 2_awk.txt |awk '{a[$2]+=$3}END{for (i in a)print i,a[i]}'
A 3
B 3
C 3
D 4
E 3
(4)按照第二列分组,计算第三列的总数,只打印出总数等于4的
[root@localhost ~]# cat 2_awk.txt |awk '{a[$2]=a[$2]+$3}END{for (i in a)if(a[i]==4) print i,a[i]}'
D 4
(5)按照第二列分组,计算第三列和第一列的总数
[root@localhost ~]# cat 2_awk.txt |awk '{a[$2]=a[$2]+$3;b[$2]=b[$2]+$1}END{for (i in a) print i,a[i],b[i]}'
A 3 7
B 3 9
C 3 11
D 4 13
E 3 5