[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