码迷,mamicode.com
首页 > 其他好文 > 详细

【译】 AWK教程指南 8处理多行数据

时间:2014-05-04 11:31:49      阅读:308      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   color   

  awk 每次从数据文件中只读取一行数据进行处理。awk是依照其内置变量 RS(Record Separator) 的定义将文件中的数据分隔成一行一行的Record。RS 的默认值是 "\n"(换行符),故平常awk中一行数据就是一条 Record。

  但有些文件中一条Record涵盖了多行数据,这种情况下不能再以 "\n" 来分隔Records。最常使用的方法是相邻的Records之间改以 一个空白行 来隔开。

  在awk程序中,令 RS = ""(空字符串)后,awk把会空白行当成来文件中Record的分隔符。显然awk对 RS = "" 另有解释方式,简略描述如下,

  当 RS = "" 时:

    1. 数个相邻的空白行,awk仅视成一个单一的Record Saparator。(awk不会于两个相邻的空白行之间读取一条空的Record)

    2. awk会略过(skip)文件头或文件尾的空白行。故不会因为这样的空白行,造成awk多读入了两条空的记录。

  请观察下例,首先建立一个数据文件 week.rpt 如下:

bubuko.com,布布扣
 

        张长弓
        GNUPLOT 入门 

 

        吴国强
        Latex 简介
        VAST-2 使用手册
        mathematic 入门

 

        李小华
        awk Tutorial Guide
        Regular Expression 
bubuko.com,布布扣

  该文件的开头有数行空白行,各条记录之间使用一个或数个空白行隔开。读者请细心观察,当 RS = "" 时,awk读取该数据文件的方式。

  编辑一个awk程序文件 make_report 如下:

bubuko.com,布布扣
    awk     BEGIN {
      FS = "\n"
      RS = ""
      split( "一. 二. 三. 四. 五. 六. 七. 八. 九.", C_Number, " " )
    }
    {
      printf("\n%s 报告人 : %s \n",C_Number[NR],$1)
      for( i=2; i <= NF; i++) 
        printf(" %d. %s\n", i-1, $i)
    } 
     $*
bubuko.com,布布扣

  执行    

bubuko.com,布布扣
    $ ./make_report week.rpt
bubuko.com,布布扣

  屏幕产生结果如下:

                bubuko.com,布布扣

说 明:

  1. 本程序同时也改变字段分隔字符( FS= "\n" ),如此一条记录中的每一行都是一个字段。

  例如: awk读入的第一条记录为

bubuko.com,布布扣
    张长弓
    GNUPLOT 入门
bubuko.com,布布扣

  其中 $1 指的是"张长弓",$2 指的是"GNUPLOT 入门"

  2. 上式中的C_Number[ ]是一个数组(array),用以记录中文数字。

  例如:C_Number[1] = "一.", C_Number[2] = "二."

  这过程使用awk字符串函数 split( ) 来把中文数字放进数组 C_Number[ ]中。

  函数 split( )用法如下:

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

    awk将依所指定的分隔字符(field separator)分隔原字符串成一个个的字段(field),并以指定的 数组 记录各个被分隔的字段。

【译】 AWK教程指南 8处理多行数据,布布扣,bubuko.com

【译】 AWK教程指南 8处理多行数据

标签:style   blog   class   code   java   color   

原文地址:http://www.cnblogs.com/qieerbushejinshikelou/p/3705534.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!