您的位置:首页 > 其它

awk使用 第7部分 awk对多行数据的处理实例

2013-10-15 11:03 381 查看
awk 每次从数据文件中只读取一行数据进行处理,这是因为awk中有一个内建变量RS(Record Separator) ,RS将文件中的数据分隔成以行为单位的记录record。RS默认值以”/n”(跳行符号)分隔数据文件中的信息,所以默认情况下awk 中一行数据就是一行Record。但有些文件中一行Record涵盖了多行数据,这种情况下不能再以”/n” 来分隔Records。最常使用的方法是相邻的Records之间改用一个空白行来分隔。在awk程序中,令RS= “”(空字符串)后,awk把会空白行当成来文件中Record的分隔符。显然awk对RS=”"另有深意,简单来说是这样的,当RS=”"
时:多个相邻的空白行,awk仅作为一个Record Saparator(awk不会在多个相邻的空白行之中选取一行做为空的Record) ;awk会略过(skip)文件头和文件尾的空白行,所以不会因为有这样的空白行,造成awk多读了二行空的数据。下面举个例子看一下,首先建立一个数据文件myfreelinux.dat,内容如下:

[root@myfreelinux pub]# cat myfreelinux.dat

 

wanger 

linux_basic

lisan 

linux_server

windows_server

zhaosi 

awk_tools

grub

regular_expression

    该文件的开头有3行空白行, 各行Record之间分别用2个和1个空白行隔开。那么下面,通过几个例子来看一下。首先编辑一个awk程序脚本report1.awk,内容如下:[root@myfreelinux pub]# cat report1.awk

#!/bin/sh

awk ‘BEGIN{

FS=”/n”;

RS=”";

split(“one:.two:.three:.four:.five:.six:.seven:.eight:.nine:.ten:.”,number,”.”);

}

{

printf(“/n%s reporter is : %s/n”,number[NR],$1);

for(i=2;i<=NF;i++)

 printf(“%d %s/n”,i-1,$i);

}’ $*

执行该程序脚本和产生的结果如下:

[root@myfreelinux pub]# bash report1.awk myfreelinux.dat

one: reporter is : wanger 

1 linux_basic

two: reporter is : lisan 

1 linux_server

2 windows_server

three: reporter is : zhaosi 

1 awk_tools

2 grub

3 regular_expression

    解释说明:上面这个程序的字段分隔字符是( FS= “/n” ),这样的话一行数据就是一个field,而且RS=“”,所以这三个用户的记录是通过空行来分隔的。那么awk读入的第一行Record 为

wanger 

linux_basic

    其中$1的值是”wanger”,$2的值是:“ linux_basic”,程序中的number[ ]是一个数组(array),用来记录英文数字,比如number[1]=one:,number[2]=two:等等,这个是使用awk的字符串函 数split()来把英文数字放进数组number[ ]中的。

   函数split( )用法如下:

   split( 原字符串,数组名,分隔字符(field separator) ) 

    awk将根据指定的分隔字符(field separator)分隔原字符串成一个个的字段(field), 并将各字段记录到数组中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: