awk的使用 第二部分 awk的运行方式

在linux/UNIX 的命令行上输入一下格式的指令: ( “$”表Shell命令行上 的提示符号)
    $awk   ‘awk程序’   数据文件名
    上面这条语句中,awk会先编译该程序, 然后执行该程序来处理所指定的数据文件。
    awk程序的主要结构: awk程序中主要语法是 Pattern { Actions},即模式{动作}, 所以常见的awk 程序的机构如下:
    Pattern1 { Actions1 }
    Pattern2 { Actions2 }
    ……
    Pattern3 { Actions3 }
    Pattern 是什么? awk 可接受许多不同型态的Pattern。 一般常使用 “关系表达式”(Relational expression) 来当成 Pattern。 例如: x > 34 是一个Pattern, 判断变x与34是否存在大于的关系。 x == y是一个Pattern, 判断变量x与变量y是否存在等于的关系。 上式中 x>34 ,x ==y 便是典型的Pattern。 awk 提供C 语言中常见的关系运算符(Relational Operators) 如 >, <, >=, <=, ==, != 。此外, awk 还提供~ (匹配match) 及 !~(非匹配not match) 二个关系运算符。 其用法与涵义如下:
    如果A 为一字符串, B 为一正则表达式(Regular Expression) ,A ~ B 判断字符串A 中是否包含能匹配(match)B表达式的子字符串。 A !~ B 判断字符串A 中是否不包含能匹配(match)B表达式的子字符串。 例如:”banana” ~ /an/ 整个是一个Pattern。 因为”banana”中含有可以匹配/an/的子字符串,所以此关系式成立  (true),整个Pattern的值为true。
     有少数awk文章, 把~, !~ 当成另一类的操作符(Operator),而不作为一种 Relational Operator。在这里将这两个运算符当成一种Relational Operator。  

    Actions 是什么?
    Actions 是由许多awk指令构成。awk 的指令与C 语言中的指令十分类似。 例如:awk 的I/O指令: print, printf( ), getline……
    awk的流程控制指令:
     if(…){…} else{…}, while(…){…}…
     awk 如何处理模式和动作的呢?(Pattern { Actions } ? ),awk 会先判断(Evaluate)Pattern的值, 如果Pattern的值为true (或不为0的数字,或不是空的字符串),则awk将执行该Pattern所对应的Actions。否则,如果Pattern之值不为true, 则awk 将不执行该Pattern所对应的Actions。
    例如:如果awk程序中有下列两指令 50 > 23 {print “Hello! The word!!” } “banana” ~ /123/ { print “Good morning !” }
    awk会先判断50 >23 是否成立,因为该式成立,所以awk将打印出”Hello! The word!!”。 而另一Pattern 为”banana” ~/123/, 因为”banana” 内未含有任何子字符串可匹配(match)/123/,所以Pattern 的值是false,awk将不会打印出 “Good morning !”  
     awk 如何处理{ Actions } 的语法是什么呢?
    有时语法Pattern { Actions }中,Pattern 部分会省略,只剩下 {Actions}。这种情况表示”无条件执行这个Actions”。  
 

awk 的字段变量
    awk 所内建的字段变量及其涵意如下:
    字段变量     含义
    $0                一字符串, 其内容为目前awk 所读入的数据行。
     $1               $0 上第一个字段的数据。
    $2                $0 上第二个字段的数据
    其余类推 。
    读入数据行时,awk如何更新(update)这些内建的字段变量?
    当awk 从数据文件中读取一个数据行时,awk 会使用内建变量$0 进行记录。当$0 被改动时(例如:读入新的数据行或改变$0的值…), awk 会立刻重新分析$0的字段情况,并将$0上各字段的数据用$1,$2…进行记录。  

     awk 的内建变量(Built-in Variables)
    awk 提供了许多内建变量,使用者可以在程序中使用这些变量来取得相关信息。常见的内建变量有:
    内建变量                   含义
    NF                               Number of Fields 为一整数,其值表示$0上所存在的字段数目。
    NR                               Number of Records为一整数,其值表示awk 已读入的数据行数目。 
    FILENAME             awk正在处理的数据文件文件名。

    例如:awk 从资料文件emp.dat 中读入第一笔数据行“A101 chenying 100 210”之后,程序中:$0 的值就是“A101 chenying 100 210”,$1的值是 “A101″,$2 的值是 “chenying”,$3的值是100,$4的值是210,$NF的值是4,$NR 的值是1,$FILENAME 的值是”emp.dat”。
     awk 的工作流程:执行awk 时,它会反复进行下列四步骤:
     1、自动从指定的数据文件中读取一个数据行。   
     2、自动更新(Update)相关的内建变量之值。 如:NF,NR,$0…
    3、依次执行程序中所有的Pattern { Actions } 指令。   
    4、当执行完程序中所有Pattern { Actions } 时,如果数据文件中还有未读取的数据,则反复执行步骤1到步骤4。awk会自动重复进行上述4个步骤,使用者不须于程序中编写这个循环(Loop)。  

打印文件中指定的字段数据并加以计算
    awk 处理数据时,它会自动从数据文件中一次读取一行记录,并将该数据切分成一个个的字段;程序中可使用$1,$2,…直接取得各个字段的内容。这个特色让使用者轻易地使用awk 编写reformatter 来改变数据格式。
    例子:以文件emp.dat 为例,计算每人应发工资并打印报表。
     分析:awk 会自行一次读入一行数据,所以程序中仅需告诉awk 如何处理所读入的数据行。执行如下命令:
    $ awk  ‘{ print $2,$3 * $4 }’  emp.dat
    执行结果时,屏幕出现 :
    chenying      21000
    linxiyu          23650
     …………….
    linux/UNIX命令行上,执行awk 的语法为:$awk  ’awk程序’  欲处理的资料文件文件名;本例中程序部分是{print $2, $3 * $4}。 把程序置于命令行时,程序之前后须以’ 括住。emp.dat 为指定给该程序处理的数据文件文件名。本程序中使用:Pattern { Actions } 语法,但是Pattern 部分被省略,表无任何限制条件,所以awk读入每笔数据行后都将无条件执行这个Actions。 print为awk所提供的输出指令,会将数据输出到标准输出stdout(屏幕)。 print 的参数间彼此以”,” (逗号) 隔开,打印出数据时彼此间会以空白隔开。
    如果将上述的程序部分储存于文件pay1.awk 中,执行命令时再指定awk 程序文件的文件名。 这是执行awk 的另一种方式,适用于程序较大的情况, 其语法如下:
    $ awk   -f   awk程序文件名  数据文件文件名 
    $ awk -f pay1.awk emp.dat 
   

    awk 中也提供与 C 语言中类似用法的printf()函数,使用该函数可进一步控制数据的输出格式。编辑另一个awk程序如下,并取名为pay2.awk  
    { printf(“%10s Work hours: %3d Pay: %5d/n”, $2,$3, $3* $4) }  
    执行下列命令      
    $awk -f  pay2.awk  emp.dat      
    执行结果屏幕出现:    
  chenying Workhours: 100 and pay: 21000
   linxiyu Workhours: 110 and pay: 23650
  degnming Workhours: 130 and pay: 27170
   liuchao Workhours: 125 and pay: 27500
    hejing Workhours: 95 and pay: 19950

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值