您的位置:首页 > 其它

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

2012-11-08 11:40 155 查看
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的例子

先执行:

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

再执行:

cat date.txt

输出:

2012年11月
abc

说明:

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

2)带有close的例子

先执行:

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

再执行:

cat date.txt

输出:

abc

说明:

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

2.system

该函数用于执行系统命令

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

输出:

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

说明:

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

3.getline

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

1)通过管道符输入

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

输出:

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

说明:

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

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

输出:

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

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

2)通过文件流输入

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

输出:

张三
13512345678
zhangsan@163.com
新浪

李四
13811111111
lisi@google.com
百度

说明:

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

3)从命令行输入

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

输出:

Enter your name:
dddd
dddd

说明:

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

总结:

至此,awk的学习笔记算是结束了,对于表格类的数据,如日志,csv等,用awk可以很方便的处理。目前用得比较多的是将excel导出的数据用awk整理成sql再通过命令行导入到库,在数据量较大时,这种处理会比直接导入excel要快得多。顺便说一下,学习完一门技术如果不用很快就会忘记的,多用才是王道,共勉。
本文出自 “凡星的技术博客” 博客,请务必保留此出处http://ustb80.blog.51cto.com/6139482/1053682
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: