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

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), 并将各字段记录到数组中。

你可能感兴趣的:(awk使用 第7部分 awk对多行数据的处理实例)