使用awk进行文本处理
有过大文本处理经历的朋友一定都知道awk,这是一种脚本语言,对于处理一定格式的数据还是很方便使用的。下面介绍一下awk的常用方法。
如果想系统学习,请看http://doc.lazyhack.net/awk.htm
1 awk的内置变量
awk 所内建的字段变量及其涵意如下 :
字段变量 |
含义 |
$0 |
一字符串, 其内容为目前 awk 所读入的数据行. |
$1 |
$0 上第一个字段的数据. |
$2 |
$0 上第二个字段的数据. |
... |
其余类推 |
内建变量 |
含义 |
NF (Number of Fields) |
为一整数, 其值表$0上所存在的字段数目. |
NR (Number of Records) |
为一整数, 其值表awk已读入的数据行数目. |
FILENAMEawk |
正在处理的数据文件文件名. |
例如 : awk 从资料文件 emp.dat 中读入第一笔数据行
"A125 Jenny 100 210" 之后, 程序中:
$0 之值将是 "A125 Jenny 100 210"
$1 之值为 "A125"
$2 之值为 "Jenny"
$3 之值为 100
$4 之值为 210
$NF 之值为 4
$NR 之值为 1
$FILENAME 之值为 "emp.dat"
2 awk工作流程
awk的工作流程 :
执行awk时, 它会反复进行下列四步骤.
- 自动从指定的数据文件中读取一个数据行.
- 自动更新(Update)相关的内建变量之值. 如 : NF, NR, $0...
- 依次执行程序中 所有 的 Pattern { Actions } 指令.
- 当执行完程序中所有 Pattern { Actions } 时, 若数据文件中还有未读取的数据, 则反复执行步骤1到步骤4.
awk会自动重复进行上述4个步骤, 使用者不须于程序中编写这个循环 (Loop).
3 使用举例
两种方式:a. $ awk -f awk程序文件名 数据文件文件名 $ awk -f pay1.awk emp.dat (-f 表示指定awk程序文件)
b. $ awk '{ print $2, $3 * $4 }' emp.dat
比如存在文件emp.dat,数据如下:
A125 Jenny 100 210
A341 Dan 110 215
P158 Max 130 209
P148 John 125 220
A123 Linda 95 210
执行 $ awk '{ print $2, $3 * $4 }' emp.dat
输出:
Jenny 21000
Dan 23650
Max 27170
John 27500
Linda 19950
执行 $ awk '{printf("%6s Work hours: %3d Pay: %5d\n", $2,$3, $3* $4)}' emp.dat
输出:
Jenny Work hours: 100 Pay: 21000
Dan Work hours: 110 Pay: 23650
Max Work hours: 130 Pay: 27170
John Work hours: 125 Pay: 27500
Linda Work hours: 95 Pay: 19950
3 awk 参数
-v 指定程序中的变量 awk -v a=1 '{xxx}' 可以使用a变量
-f 指定程序外部文件 awk -f pro.awk data
-F 指定分隔符 awk -f \\t '{xxx}' 指定分隔符为\t ,默认为空格
4 awk高级用法——数组
首先建立一个数据文件, 并取名为 reg.dat. 此为一学生注册的资料文件; 第一栏为学生姓名, 其后为该生所修课程.
Mary O.S. Arch. Discrete
Steve D.S. Algorithm Arch.
Wang Discrete Graphics O.S.
Lisa Graphics A.I.
Lily Discrete Algorithm
要统计各科修课人数,执行如下:
建立如下程序,并取名为 course.awk:
{ for( i=2; i <= NF; i++) Number[$i]++ }
END{for(course in Number) printf("%10s %d\n", course, Number[course] )}
执行下列命令 :
$awk -f course.awk reg.dat
执行结果如下 :
Graphics 2
O.S. 2
Discrete 3
A.I. 1
D.S. 1
Arch. 2
Algorithm 2