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

  awk
处理数据时,它会自动从数据文件中一次读取一条记录,并会将该记录切分成一个个的字段;程序中可使用 $1, $2,...
直接取得各个字段的内容。这个特色让使用者易于用 awk 编写 reformatter 来改变数据格式。

范例:以数据文件 emp.dat
为例,计算每人应发工资并打印报表。

分析:awk
会自行一次读入一条记录,故程序中仅需告诉 awk 如何处理所读入的数据行。

  执行如下命令:($ 表UNIX命令行上的提示符)   


    $ awk ‘{ print $2, $3 * $4 }‘ emp.dat

  执行结果如下:

  屏幕出现:

        

说明:

  1. UNIX命令行上,执行awk的语法为:   


    $ awk  ‘awk程序‘  要处理的数据文件名

  本范例中的 程序部分为
{print $2, $3 * $4}。把程序置于命令行时,程序之前后必须以 ‘ (单引号)括住。

  2. emp.dat
为指定给该程序处理的数据文件名。

  3. 本程序中使用:Pattern { Actions }
语法。          








Pattern Actions
  print
$2, $3 * $4
    

  Pattern
部分被省略,表示无任何限制条件。故awk读入每行数据后都将无条件执行这个 Actions。

  4. print为 awk
所提供的输出指令,会将数据输出到stdout(屏幕)。print 的参数间彼此以 "," (逗号) 隔开,打印出数据时彼此间会以空白隔开。(参考 附录 D
内置变量OFS)

  5. 将上述的 程序部分
储存于文件 pay1.awk 中,执行命令时再指定 awk程序文件
的文件名。这是执行awk的另一种方式,特别适用于程序较大的情况,其语法如下:    


    $ awk -f awk程序文件名 数据文件名

  故执行下列两命令,将产生同样的结果。


    $ awk -f pay1.awk emp.dat  
    $ awk ‘{ print $2, $3 * $4 }‘ emp.dat

  读者可使用 "-f" 参数,让awk主程序使用“其它
仅含 awk函数 的程序文件中的函数 ”

  其语法如下:  


    $ awk -f awk主程序文件名 -f awk函数文件名 数据文件名

  (有关 awk 中函数的声明与使用于 7.4
中说明)

  6. awk中也提供与 C 语言中类似用法的 printf()
函数,使用该函数可进一步控制数据的输出格式。

  编辑另一个awk程序如下,并取名为 pay2.awk


    { printf("%6s Work hours: %3d Pay: %5d\n", $2, $3, $3 * $4) }

  执行下列命令


    $ awk -f pay2.awk emp.dat

  执行结果屏幕出现:

        

【译】 AWK教程指南 3计算并打印文件中指定的字段数据,布布扣,bubuko.com

时间: 2024-10-16 22:00:11

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

【译】 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教程指南 7AWK应用实例

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

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

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

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

Pattern { Action }为awk中最主要的语法.若某Pattern的值为真则执行它后面的 Action. awk中常使用"关系表达式" (Relational Expression)来当成 Pattern. awk 中除了>, <, ==, != ,...等关系运算符( Relational Operators )外,另外提供 ~(match),!~(Not Match) 二个关系运算符.利用这两个运算符,可判断某字符串是否包含能匹配所指定正则表达式的子字符串.

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

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

【译】 AWK教程指南 6在AWK程序中使用Shell命令

awk程序中允许调用Shell指令,并提供管道解决awk与系统间数据传递的问题.所以awk很容易使用系统资源,读者可利用这个特点来编写某些适用的系统工具. 范例:写一个awk程序来打印出线上人数. 将下列程序建文件,命名为 count.awk BEGIN { while ( "who" | getline ) n++ print n } 并执行下列命令: $ awk -f count.awk 执行结果将会打印出目前在线人数. 说 明: 1. awk 程序并不一定要处理数据文件,以本例而

【译】 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教程指南 2概述

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