【背景】
awk是linux中一个功能强大的文本处理命令。awk逐行读入数据并以字段为基本单元来组织和处理数据,对每行读入的数据都会进行条件匹配并执行对应的动作。awk常见于对文本文件中的数据执行计算、统计等操作。
【命令格式】
awk 'BEGIN {action} condition {action} END {action}' filenameawk可以以文件名作为输入或者标准输入。
【工作方式】
awk的工作方式如下:
1.执行BEGIN中的语句。
2.从输入读取一行数据,执行条件匹配,如果匹配成功则执行动作,否则不执行。继续执行此步直到输入结束。
3.执行END中的语句。
【特殊变量】
1.NR:表示读入数据的行号。
2.NF:表示当前读入行的字段数量。
3.$0:当前读入行的文本内容。
4.$1:当前读入行的第一个字段,类似的还有$2、$3等。
【常见用法】
本次用来实验的text.txt的文本内容如下:
11 Tom computer-science 4.0
12 Jack economic 3.8
13 Marry biology 3.9
14 Cherry mathematics 4.1
15 Jim chemistry 4.2
1.输出文件的所有内容
awk '{print}' text.txt如果不对action附带条件,则默认所有输入都符合条件。
11 Tom computer-science 4.0
12 Jack economic 3.8
13 Marry biology 3.9
14 Cherry mathematics 4.1
15 Jim chemistry 4.2
2.输出文件的第一行数据
awk 'NR==1{print}' text.txt
11 Tom computer-science 4.0
这里使用了前面提到的特殊变量。
3.输出匹配bio字符串的行
awk '/bio/{print}' text.txt
13 Marry biology 3.9
使用!可以表示取反。
4.匹配多个条件
(1)例如需要打印第一行和第三行数据:
awk 'NR==1同理,这些条件也可是正则表达式。
> NR==3{print}' text.txt
11 Tom computer-science 4.0
13 Marry biology 3.9
(2)如果需要打印第一行到第三行之间的数据:
awk 'NR==1,NR==3{print}' text.txt
11 Tom computer-science 4.0
12 Jack economic 3.8
13 Marry biology 3.9
注意上个例子的两个条件之间用换行符隔开,而这个例子的两个条件之间用逗号隔开。
5.使用begin和end块
例如需要输出辅助类的信息:
awk 'BEGIN{print "uid name majority gpa"} {print} END{print "***end of file***"}' text.txt这样就可以在开始和结尾处输出一些辅助信息。
uid name majority gpa
11 Tom computer-science 4.0
12 Jack economic 3.8
13 Marry biology 3.9
14 Cherry mathematics 4.1
15 Jim chemistry 4.2
***end of file***
6.计算平均gpa
awk 'begin{average=0} {average+=$4} END{average/=NR;print "average gpa is "average}' text.txt
average gpa is 4
7.传递外部变量值给awk
var=1有时需要将一些值传递给awk命令,就可以使用-v选项。
echo | awk -v VAR=$var '{print VAR}'
echo | awk '{print VAR}' VAR=$var
8.设定定界符
awk -F : '{print}' text.txt
awk 'BEGIN{IFS=":"} {print}' text.txt
awk的认为字段之间的默认定界符是空格,但有些文件并不是以空格隔开字段,此时需要调整定界符便于awk切分字段。
【待续】
上面总结了awk的基本用法,实际上awk的复杂程度类似于小型的编程语言,深入钻研还有很多内容可学。等到需要之时再来回顾吧,待续...