【译】 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),故所有数据行调整后的数据都将被打印。

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

时间: 2024-10-12 21:31:18

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

【译】 AWK教程指南 7AWK应用实例

本节将示范一个统计上班到达时间及迟到次数的程序. 这程序每日被执行时将读入两个数据文件: * 员工当日到班时间的数据文件 ( 如下列的 arr.dat ) * 存放员工当月迟到累计次数的文件 当程序执行执完毕后将更新第二个数据文件的数据(迟到次数),并打印当日的报表.这程序将分成下列数小节逐步完成,其大纲如下: 7.1 在到班资料文件 arr.dat 之前增加一行抬头"ID Number Arrvial Time",并产生报表输出到文件today_rpt1 中. <在awk中如何

【译】 AWK教程指南 3计算并打印文件中指定的字段数据

awk 处理数据时,它会自动从数据文件中一次读取一条记录,并会将该记录切分成一个个的字段:程序中可使用 $1, $2,... 直接取得各个字段的内容.这个特色让使用者易于用 awk 编写 reformatter 来改变数据格式. 范例:以数据文件 emp.dat 为例,计算每人应发工资并打印报表. 分析:awk 会自行一次读入一条记录,故程序中仅需告诉 awk 如何处理所读入的数据行. 执行如下命令:($ 表UNIX命令行上的提示符)  $ awk '{ print $2, $3 * $4 }'

【译】 AWK教程指南 2概述

2.1 为什么用AWK 由于awk具有上述特色,在问题处理的过程中,可轻易使用awk来撰写一些小工具:这些小工具并非用来解决整个大问题,它们只扮演解决个别问题过程的某些角色,可通过Shell所提供的pipe将数据按需要传送给不同的小工具进行处理,以解决整个大问题.这种解题方式,使得这些小工具可因不同需求而被重复组合及使用(reuse):也可通过这种方式来先行测试大程序原型的可行性与正确性,将来若需要较高的执行速度时再用C语言来改写.这是awk最常被应用之处.若能常常如此处理问题,读者可以以更高的

【译】 AWK教程指南 附录A-Patterns

awk 通过判断 Pattern 的值来决定是否执行其后所对应的Actions.这里列出几种常见的Pattern: A.1 BEGIN BEGIN 为 awk 的保留字,是一种特殊的 Pattern. BEGIN 成立(其值为true)的时机是: "awk 程序一开始执行,尚未读取任何数据之前." 所以在 BEGIN { Actions } 语法中,其 Actions 部份仅于程序一开始执行时被执行一次.当 awk 从数据文件读入数据行后, BEGIN 便不再成立,故不论有多少数据行,

【译】 AWK教程指南 11递归程序

awk 中除了函数的参数列表(Argument List)上的参数(Arguments)外,所有变量不管于何处出现,全被视为全局变量.其生命持续至程序结束--该变量不论在function外或 function内皆可使用,只要变量名称相同所使用的就是同一个变量,直到程序结束.因递归函数内部的变量,会因它调用子函数(本身)而重复使用,故编写该类函数时应特别留心. 例如:执行 awk ' BEGIN { x = 35 y = 45 test_variable( x ) printf("Return t

【译】 AWK教程指南 1前言

前面的话: 这几天写了一个程序,在同一个目录里生成了很多文件,需要统计其中部分文件的总大小,发现经常用到的ls.du等命令都无济于事,我甚至都想到了最笨的方法,写一个脚本:mkdir一个新目录,把要统计总大小的文件mv过去,然后du或者ls -lh新目录.诚然,这个办法又笨又不精确,于是求助万能的网络,找到的都是同一篇用了3个很长的循环来统计的脚本,还是自己先苦读"经书"吧.鸟哥的书第十二章就有现成的示例,就用到了马上要出场的awk工具,用法如下(统计目录下所有tmp*文件的总大小,以

【译】 AWK教程指南 附录E-正则表达式

为什么要使用正则表达式 UNIX 中提供了许多 指令 和 tools,它们具有在文件中 查找(Search)字串或替换(Replace)字串 的功能.像 grep, vi , sed, awk,... 不论是查找字串或替换字串,都得先告诉这些指令所要查找(被替换)的字串为何.若未能预先明确知道所要查找(被替换)的字串为何,只知该字串存在的范围或特征时,例如: (一)查找 "T0.c", "T1.c", "T2.c".... "T9.c&

【译】 AWK教程指南 附录B-Actions

Actions 是由下列指令(statement)所组成: 1 表达式 ( 函数调用,赋值...) 2 print 表达式列表 3 printf( 格式化字符串, 表达式列表) 4 if( 表达式 ) 语句 [else 语句] 5 while( 表达式 ) 语句 6 do 语句 while( 表达式) 7 for( 表达式; 表达式; 表达式) 语句 8 for( variable in array) 语句 9 delete 10 break 11 continue 12 next 13 exi

【译】 AWK教程指南 5AWK中的数组

awk程序中允许使用字符串当做数组的下标(index).利用这个特色十分有助于资料统计工作.(使用字符串当下标的数组称为Associative Array) 首先建立一个数据文件,并取名为 reg.dat.此为一学生注册的资料文件:第一栏为学生姓名,其后为该生所修课程. awk中数组的特性 1. 使用字符串当数组的下标(index). 2. 使用数组前不须声明数组名及其大小. 例如:希望用数组来记录 reg.dat 中各门课程的修课人数.这情况,有两项信息必须储存: (a) 课程名称,如: "O