使用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时, 它会反复进行下列四步骤.

  1. 自动从指定的数据文件中读取一个数据行.
  2. 自动更新(Update)相关的内建变量之值. 如 : NF, NR, $0...
  3. 依次执行程序中 所有 的 Pattern { Actions } 指令.
  4. 当执行完程序中所有 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

 


posted @ 2012-01-20 08:22  ~大器晚成~  阅读(3188)  评论(0编辑  收藏  举报