# 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

# 直接看例子

# 1. 统计行数

cat 001.txt | awk '{c++;} END { printf "lineCount=%d\n",c }'

#解释说明:
action段代码,执行了累加操作,END段代码格式化输出了行数,printf的语法类似c和java
1
2
3
4

# 2. 统计求和,001.txt里每行一个数字

cat 001.txt | awk '{sum+=$1;} END { printf "sum=%d\n",sum }'

#解释说明:$1 表示第一列
1
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

# 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

# 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

# 参考资料

AWK程序设计语言 http://awk.readthedocs.io/en/latest/index.html (opens new window)