close可以关闭打开的文件以解约可用资源。awk里也没有排序函数,以为它只需要复制功能强大的sort命令即可。
getline语句以及awk管道里的输出重定向都可与外部程序通信,system(command)函数提供的是第三种方式:其返回值是命令的退出码。所以上边的例子可以写成:
tmpfile = "/tmp/telephone.tmp"
for ( name in telephone)
print name "t" telephone[name] | > tmpfile
close (tmpfile)
system("sort < " tmpfile)
while((getline < tmpfile) > 0)
print
close(tmpfile)
对于被system()执行的命令并不需要调用close(),因为close()仅针对以I/O重定向运算符所打开的文件或管道,还有getline、print、printf。其他几个例子:
system("rm -f " tmpfile)
system("cat < 由于每次调用system()都会起始一个全新的shell,因此没有简单方式可以在分开的system()调用内的命令之间传递数据,除非通过中间文件。
就到目前这里,awk足够编写任何数据处理程序了。对于大型程序,不利于维护和查看,所以awk提供函数,就像c一样,awk也可选择性的返回标量值。函数可以定义在程序顶层的任何位置:成对的模式/操作组之前、之间、之后。在单一文件的程序里,惯例是将所有函数放在成对的模式/操作码之后,且让他们依字母顺序排列,这样会读起来方便。定义如下:
function name(arg1,arg2....){ statement(s) ; return expression ;}
局部的变量会覆盖全局的同名变量。
awk里其他的内建函数:
子字符串提取substr(string,start,len),下标从1开始。
字母大小写转换tolower(string),toupper(string)。无法处理罕见字母和重音字母。
字符查找index(string,find),返回起始位置,找不到给0.
字符串匹配match(string,regexp),匹配则返回string的索引,并且会更新全局变量RSTART和RLENGTH,获取匹配方法:substr(string, RSTART,RLENGTH)。
字符串替换sub(regexp,replacement,target)和gsub(regexp,replacement,target)。前者将target与正则表达式进行匹配,将最左边最长的匹配部分替换为字符串。
gsub()的运行类似,不过它会替换所有匹配的字符串。两种函数都返回替换的数目。如果省略第三个参数,则默认值为当前的记录$0。两个函数里replacement里的字符&都会被替换为target中与regexp匹配的文本。使用&可关闭这一功能,而且请记得如果你要在引号字符串里使用它时,以双斜杠转义它。如gsub(/[aeiouyAEIOUY]/,"&&")令所有当前$0里的元音字母乘以两倍,而gsub(/[aeiouyAEIOUY]/,"&&")则是将所有元音字母替换为一对&符号。
字符串分割:awk针对$0自动提供了方便的分割为$1 $2 .... $NF,也可以函数来做:split(string,array,regexp)将string切割为片段,并存储到array里。如果regexp省略,则默认内建字段分隔符为FS。函数返回array里的元素数量。填写分割符的时候留意默认字段分隔符" "与"[ ]"的差异:前者会忽略前置与结尾的空白,并于运行时将空白视为一个单独空格,后者则正好匹配一个空格,对绝大多数文本处理而言,第一种模式已经满足功能上的需求了。










