awk学习笔记八-Actions

原文: http://doc.lazyhack.net/awk.htm

Actions

Actions 是由下列指令(statement)所组成 :

  • 表达式 ( function calls, assignments..)
  • print 表达式列表
  • printf( 格式化字符串表达式列表)
  • if( 表达式 ) 语句 [else 语句]
  • while( 表达式 ) 语句
  • do 语句 while( 表达式)
  • for( 表达式表达式表达式语句
  • for( variable in array) 语句
  • delete
  • break
  • continue
  • next
  • exit [表达式]
  • 语句

awk 中大部分指令与 C 语言中的用法一致此处仅介绍较为常用或容易混淆的指令的用法.

 close  指令

该指令用以关闭一个打开的文件 pipe (见下例)

  :

BEGIN {  print "ID #   Salary" > "data.rpt" }  

{  print $1 , $2 * $3  | "sort -k 1 > data.rpt" }   

END{  close( "data.rpt" )

    close( "sort -k 1 > data.rpt" )

    print " There are", NR, "records processed."

}

  :

(a)上例中一开始执行 print "ID #   Salary" > "data.rpt" 指令来输出一行抬头它使用 I/O Redirection ( > )将数据转输出到data.rpt,故此时文件 data.rpt 是处於 Open 状态.

(b)指令 print $1, $2 * $3 不停的将输出的资料送往 pipe(|), awk在程序将结束时才会呼叫 shell 使用指令 "sort -k 1 > data.rpt" 来处理 pipe 中的数据并未立即执行这点与 Unix pipe的用法不尽相同.

(c)最后希望於文件 data.rpt 的末尾处加上一行 "There are.....".但此时, Shell尚未执行 "sort -k 1 > data.rpt" 故各数据行排序后的 ID  Salary 等数据尚未写入data.rpt. 所以得命令 awk 提前先通知 Shell 执行命令 "sort -k 1 > data.rpt" 来处理 pipe 中的资料. awk中这个动作称为 close pipe. 是由执行 close ( "shell command" )来完成需留心 close( )指令中的 shell command

需与"|"后方的 shell command 完全相同(一字不差), 较佳的方法是先以该字串定义一个简短的变量程序中再以此变量代替该shell command  

(d)为什么执行 close("data.rpt") ?  因为 sort 完后的资料也将写到data.rpt,而该文件正为awk所打开使用(write)awk程式中应先关闭data.rpt. 以免造成因二个 processes 同时打开一个文件进行输出(write)所产生的错误.

 system 指令

该指令用以执行 Shell上的 command.

  :

DataFile = "invent.rpt"

system( "rm " DataFile ) 

说明 :

(a)system("字符串")指令接受一个字符串当成Shell的命令上例中使用一个字串常数"rm " 连接(concate)一个变量 DataFile 形成要求 Shell 执行的命令.Shell 实际执行的命令为 "rm invent.rpt". 

 "|" pipe指令

"|" 配合 awk 输出指令可把 output  stdout 的资料继续转送给Shell 上的某一命令当成input的资料.

"|"  配合 awk getline 指令可呼叫 Shell 执行某一命令再以 awk  getline 指令将该命令的所产生的资料读进 awk 程序中.

  :

{ print $1, $2 * $3  | "sort -k 1 > result" }     

"date" |  getline  Date_data

你可能感兴趣的:(System,awk,close,pipe,actions)