awk学习笔记(17) - 其他函数

awk的内置函数不多,除去数学和字符串的都归到其他类了。如下表:

函数 说明
close( Expression ) 用同一个带字符串值的 Expression 参数来关闭由 print 或 printf 语句打开的或调用 getline 函数打开的文件或管道。如果文件或管道成功关闭,则返回 0;其它情况下返回非零值。如果打算写一个文件,并稍后在同一个程序中读取文件,则 close 语句是必需的。
system(Command ) 执行 Command 参数指定的命令,并返回退出状态。等同于system子例程。
Expression | getline [ Variable ] 从来自 Expression 参数指定的命令的输出中通过管道传送的流中读取一个输入记录,并将该记录的值指定给 Variable 参数指定的变量。如果当前未打开将 Expression 参数的值作为其命令名称的流,则创建流。创建的流等同于调用popen子例程,此时 Command 参数取 Expression 参数的值且 Mode 参数设置为一个是 r 的值。只要流保留打开且 Expression 参数求得同一个字符串,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。
getline [ Variable ] < Expression 从 Expression 参数指定的文件读取输入的下一个记录,并将 Variable 参数指定的变量设置为该记录的值。只要流保留打开且 Expression 参数对同一个字符串求值,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。
getline [ Variable ] 将 Variable 参数指定的变量设置为从当前输入文件读取的下一个输入记录。如果未指定 Variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量。

 

下面举例说明:

1.close

该函数用于关闭输入输出文件,下面看两个例子,注意区别:

1)这是不带close的例子

先执行:


  1. sudo awk 'BEGIN{"date"|getline;print $1 > "date.txt";"echo abc"|getline;print $0 > "date.txt"}' 

再执行:


  1. cat date.txt 

输出:


  1. 2012年11月 
  2. abc 

说明:

由于没有关闭之前的date.txt文件,后面的内容会追加写入到date.txt中。

2)带有close的例子

先执行:


  1. sudo awk 'BEGIN{"date"|getline;print $1 > "date.txt";close("date.txt");"echo abc"|getline;print $0 > "date.txt"}' 

再执行:


  1. cat date.txt 

输出:


  1. abc 

说明:

由于中间关闭了文件,后一次写入就覆盖了前一次写入的内容。

2.system

该函数用于执行系统命令


  1. awk 'BEGIN{b=system("date");print b;}' 

输出:


  1. 2012年11月 8日 星期四 11时09分35秒 CST 

说明:

上面输出的第一行是date命令的执行结果,第二行是system的执行结果

3.getline

该函数用于输入。有三种用法:

1)通过管道符输入


  1. awk 'BEGIN{"date"|getline var;print var;}'

输出:


  1. 2012年11月 8日 星期四 11时13分07秒 CST 

说明:

上面的程序指定了一个变量var来存放getline的结果,如果没有指定,将默认为$0。如下:


  1. awk 'BEGIN{"date"|getline;print $0;}' 

输出:


  1. 2012年11月 8日 星期四 11时19分02秒 CST 

当然,如果是要输出某一列,可以用$n,如果是输出整行,$0也是可以省略的。

2)通过文件流输入


  1. awk 'BEGIN{while(getline < "address.dat"){print $0;};close("address.dat")}' 

输出:


  1. 张三 
  2. 13512345678 
  3. zhangsan@163.com 
  4. 新浪 
  5.  
  6. 李四 
  7. 13811111111 
  8. lisi@google.com 
  9. 百度 

说明:

getline从文件流中读取每一行并输出。

3)从命令行输入


  1. awk 'BEGIN{print "Enter your name:";getline name;print name;}' 

输出:


  1. Enter your name: 
  2. dddd 
  3. dddd 

说明:

第二行是用户的输入,第三行是程序的执行输出。getline接收了当前用户的输入,并在其后输出。

 

总结:

至此,awk的学习笔记算是结束了,对于表格类的数据,如日志,csv等,用awk可以很方便的处理。目前用得比较多的是将excel导出的数据用awk整理成sql再通过命令行导入到库,在数据量较大时,这种处理会比直接导入excel要快得多。顺便说一下,学习完一门技术如果不用很快就会忘记的,多用才是王道,共勉。










本文转自 ustb80 51CTO博客,原文链接:http://blog.51cto.com/ustb80/1053682,如需转载请自行联系原作者
上一篇:awk学习笔记(12) - 条件语句


下一篇:SQL物化视图 自动更新 定时刷新