1.统计求和
[bsjk@izbp172ujoo5u74o1tpjqdz 1]$ more test
AB,B1,B2,B3,B4,B5
A1,1,2,3,4,5
A2,2,1,1,1,1
A3,3,1,1,1,1
A4,4,1,1,1,1
A5,5,1,1,1,1
1.1 按列求和
- 统计某列数值之和
#非数字类型当成0计算
awk -F' ' '{sum1+=$1;sum2+=$2}END{print sum1,sum2}' test
#0 15
- 统计所有列
#输出求和行
awk -F',' '{for(i=1;i<=NF;i++)sum[i]+=$i}END{for(j=1;j<=NF-1;j++)printf sum[j]",";if(k=NF)print sum[k]}' test
结果:0,15,6,7,8,9
#输出第一行和求和行
awk -F',' '{if(NR==1)print}{for(i=1;i<=NF;i++)sum[i] += $i}END{for(j=1;j<=NF-1;j++)printf sum[j]",";if(k=NF)print sum[k]}' test
结果是:
AB,B1,B2,B3,B4,B5
0,15,6,7,8,9
1.2 按行求和
- 统计每一行数值的总和
awk -F',' '{{for(i=1;i<=NF;i++)a[NR]+=$i}print $1,a[NR]}' test
结果是:
AB 0
A1 15
A2 6
A3 7
A4 8
A5 9
2. 特殊模式BEGIN和END
-
BEGIN 和 END,BEGIN 被放置在没有读取任何数据之前,而 END 被放置在所有的数据读取完成以后执行。
-
体现如下:
BEGIN{}: 读入第一行文本之前执行的语句,一般用来初始化操作
{}: 逐行处理
END{}: 处理完最后以行文本后执行,一般用来处理输出结果
-
实例:
文件开头加START,末尾加END,打印行号和内容
awk -F',' 'BEGIN{print "START"}{print NR;print}END{print "END"}' test
#START
1
AB,B1,B2,B3,B4,B5
2
A1,1,2,3,4,5
3
A2,2,1,1,1,1
4
A3,3,1,1,1,1
5
A4,4,1,1,1,1
6
A5,5,1,1,1,1
END
3. Built-in Variables
NF( Number of Fields ) : awk 读入一行数据的字段数,通俗地说,就是一行数据被划分成了几段?便于对各字段进行遍历。
NR( Number of Records ) : awk 已读入的行数,相当于一个计数器。
RS( Record Separator ) : 行分隔符。awk从文件上读取资料时, 将根据 RS 的定义把资料切割成许多Records,而awk一次仅读入一个Record,以进行处理。预设值是’\n’
FS( Field Separator ) : 列分割符。决定了怎么将一行划分为几段。预设值是空白符(空白和Tab)