首页 > 代码库 > 【译】 AWK教程指南 4通过文本内容和对比选择指定的记录

【译】 AWK教程指南 4通过文本内容和对比选择指定的记录

  Pattern { Action }为awk中最主要的语法。若某Pattern的值为真则执行它后面的 Action。 awk中常使用"关系表达式" (Relational Expression)来当成 Pattern。

  awk 中除了>, <, ==, != ,...等关系运算符( Relational Operators )外,另外提供 ~(match),!~(Not Match) 二个关系运算符。利用这两个运算符,可判断某字符串是否包含能匹配所指定正则表达式的子字符串。由于这些特性,很容易使用awk来编写需要字符串比对、判断的程序。

 

范例:接上例,

    1. 组装部门员工调薪5%,(组装部门员工的ID以"A"开头)

    2. 所有员工最后的薪资率若仍低于100,则以100计。

    3. 编写 awk 程序打印新的员工薪资率报表。

分析:这个程序须先判断所读入的数据行是否满足指定条件,再进行某些动作。awk中 Pattern { Actions } 的语法已涵盖这种 " if ( 条件) { 动作} "的架构。 

  编写如下的程序, 并取名 adjust1.awk

    $1 ~ /^A.*/  { $3 *= 1.05 }
    $3 < 100     { $3 = 100 }
              { printf("%s %8s %d\n", $1, $2, $3)}

  执行下列命令:

    $ awk -f adjust1.awk emp.dat

  结果如下:屏幕出现:

        

说 明:

  1. awk的工作流程是:从数据文件中每次读入一行数据,依序执行完程序中所有的 Pattern{ Action }指令

Pattern Actions
$1~/^A.*/ { $3 *= 1.05 }
$3 < 100 { $3 = 100 }
  {printf("%s %8s %d\n",$1,$2,$3)}

  再从数据文件中读进下一条记录继续进行处理。

  2. 第一个 Pattern { Action }是:      

    $1 ~ /^A.*/ { $3 *= 1.05 }

  $1 ~ /^A.*/ 是一个Pattern,用来判断该行数据的第一个字段是否包含以"A"开头的子字符串。其中 /^A.*/ 是一个Regular Expression,用以表示任何以"A"开头的字符串。(有关 Regular Expression 的用法 参考 附录 E )。

  Actions 部分为 $3 *= 1.05。$3 *= 1.05 与 $3 = $3 * 1.05 意义相同,运算符"*=" 的用法则与 C 语言中一样。此后与 C 语言中用法相同的运算符或语法将不予赘述。 

  3. 第二个 Pattern { Actions } 是:      

    $3 < 100 { $3 = 100 }

  若第三个字段内容(即时薪)小于100,则调整为100。

  4. 第三个 Pattern { Actions } 是:      

    {printf("%s %8s %d\n",$1, $2, $3)}

  省略了Pattern(无条件执行Actions),故所有数据行调整后的数据都将被打印。