日历

2019年九月
« 5月    
 1
2345678
9101112131415
16171819202122
23242526272829
30  

最近评论

    AWK的使用

    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

    评论已关闭。