# awk使用入门
2018.03.28
# 基本语法
cat file | awk 'BEGIN{a} {ACTION} END {c}'
1
a是开始段,最先执行,只执行一次
action是执行段,file文件有多少行,就执行多少次
c是末尾段,最后执行,只执行一次
翻译成for循环的伪代码
//执行BEGIN代码a
//此部分可省略
for(line in lines)
{
//执行ACTION代码
}
//执行END代码c
//此部分可省略
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 直接看例子
# 1. 统计行数
cat 001.txt | awk '{c++;} END { printf "lineCount=%d\n",c }'
#解释说明:
action段代码,执行了累加操作,END段代码格式化输出了行数,printf的语法类似c和java
1
2
3
4
2
3
4
# 2. 统计求和,001.txt里每行一个数字
cat 001.txt | awk '{sum+=$1;} END { printf "sum=%d\n",sum }'
#解释说明:$1 表示第一列
1
2
3
2
3
# 3. 分段求和,if语句例子
# printf 和C、java里的格式化很相似
cat 001.txt | awk '{ if ($1<500) {sum1+=$1;} else if ($1>=500&&$1<1200) { sum2+=$1;} else sum3+=$1; } END { printf "sum1=%d, sum2=%d, sum3=%d\n",sum1,sum2,sum3 }'
#解释说明:if语句的语法类似java和c
1
2
3
4
2
3
4
# 4. 取002.txt的第二列,逗号是分隔符
cat 002.txt
#执行结果如下
1,2,3
4,5,6
#print是直接输出,FS指定分隔符
cat 002.txt | awk 'BEGIN {FS=","} {print $2}'
#执行结果如下
2
5
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 5. 对001.txt进行统计分析
#BEGIN输出表头
cat 001.txt | awk 'BEGIN{min=100000000;max=0; print "sum,count,avg"} { if ($1<min){min=$1}; if ($1>max) {max=$1};if ($1<300) {sum1+=$1;c1++;} else if ($1>=300&&$1<1000) { sum2+=$1;c2++;} else {sum3+=$1;c3++;} } END { printf "%d,%d,%d\n%d,%d,%d\n%d,%d,%d\nmin=%d,max=%d\n",sum1,c1,sum1/c1 ,sum2,c2,sum2/c2 ,sum3,c3,sum3/c3, min,max }'
#执行结果如下
sum,count,avg
264709313,2471574,107
10764453,27811,387
3044267,1641,1855
min=62,max=5466
#如果脚本太长可以把脚本写到文件里
cat 001.txt | awk -f awk.file
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 参考资料
AWK程序设计语言 http://awk.readthedocs.io/en/latest/index.html (opens new window)