Chinaunix首页 | 论坛 | 博客
  • 博客访问: 926900
  • 博文数量: 335
  • 博客积分: 10287
  • 博客等级: 上将
  • 技术积分: 3300
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-08 15:29
文章分类

全部博文(335)

文章存档

2015年(4)

2014年(15)

2013年(17)

2012年(11)

2011年(12)

2010年(96)

2009年(27)

2008年(34)

2007年(43)

2006年(39)

2005年(37)

我的朋友

分类: LINUX

2010-03-19 17:25:21

前面一篇文章《awk示例(二)》主要讲解了awk中用户定义的变量,本文主要讲解awk自己的特殊变量。

首先开看字段分隔符FS,这个变量让您可以设置awk要查找的字段之间的字符序列。前面文章中我们使用address.in作为输入时,就是将 FS 设置成 ":"。其实FS 值并没有被限制为单一字符;可以通过指定任意长度的字符模式,将它设置成规则表达式。如果我们的address.in是由一个或多个 tab 分隔的字段,而不是“:”,则可以按以下方式设置 FS

FS="\t+"

以上示例中,\t表示tab分割,我们使用特殊 "+" 规则表达式字符,它表示“一个或多个前一字符”,也就是一个或多个 tab。如果字段由空格分隔(一个或多个空格或 tab),则不需要设置FS,因为缺省FS就代表空格分隔。FS还可以是复杂的规则表达式。若我们的address.ini文件由"sep" 分隔,后面跟着三个数字,则以下规则表达式仍允许对数据进行正确的分析:

FS="sep[0-9][0-9][0-9]"

下面我们来看看“字段数量”NF变量,awk 会自动将该变量设置成当前记录中的字段数量。我们可以在条件语句中使用 NF 变量,如下面示例将判断输入文件中字段数量是否超过2个,若超过两个则显示每行的前三个字段:

{

if ( NF > 2 ) {

print $1 " " $2 " " $3

}

}

假设名为address.in的文件内容如下:

1:abc:male:13612345678

2:mary:female:12345678

3:aaa:female:44445555

4:zlx:female:13550000000

5:lucy:female:13611111111

6:david:male:10101010

test.awk内容为:

BEGIN {

FS=":"

}

{

if ( NF > 2 ) {

print $1 " " $2 " " $3

}

}

则执行awk -f test.awk address.in后,结果为:

1 abc male

2 mary female

3 aaa female

4 zlx female

5 lucy female

6 david mal

但若address.in的文件内容为:

1:abc

2:mary

3:aaa

4:zlx

5:lucy

6:david

则执行awk -f test.awk address.in后屏幕上将没有任何输出。

最后,我们来看看记录号 (NR)变量,它始终包含当前记录的编号(awk 将第一个记录算作记录号 1)。还以本文开头部分的address.in文件为例,若test.awk内容为:

BEGIN {

FS=":"

}

{

if  ( NR > 3) {

print $0

}

}

则执行awk -f test.awk address.in后,结果为:

4:zlx:female:13550000000

5:lucy:female:13611111111

6:david:male:10101010

也就是说该示例只打印记录号大于3的后三条记录。好了,本文就讲到这儿,通过前面的几篇文章,大家可以发现,awk非常擅长于文本处理,以后继续通过具体例子进一步讲解awk的特性。
阅读(463) | 评论(0) | 转发(0) |
0

上一篇:awk示例(二)

下一篇:awk简介及示例

给主人留下些什么吧!~~