小注:
1.getline是函数,next是语句。
getline函数说明:
QUOTE:
A.getline从整体上来说,应这么理解它的用法: 当其左右无重定向符 | 或 < 时,getline作用于当前文件,读入当前文件的第一行给其后跟的变量 var 或$0(无变量);应该注意到,由于awk在处理getline之前已经读入了一行,所以getline得到
的返回结果是隔行的。 当其左右有重定向符 | 或 < 时,getline则作用于定向输入文件,由于该文件是刚打开,并没有被 awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。B.getline用法大致可分为三大类(每大类又分两小类),即总共有6种用法。代码如下:QUOTE:
nawk ‘BEGIN{“cat data.txt”|getline d; print d}’ data2.txt
nawk ‘BEGIN{“cat data.txt”|getline; print $0}’ data2.txt
nawk ‘BEGIN{getline d < “data.txt”; print d}’ data2.txt
nawk ‘BEGIN{getline < “data.txt”; print $0}’ data2.txt #作者笔误。
以上四行代码均实现“只打印data.txt文件的第一行”(若打印全部行,用循环)
eg. nawk ‘BEGIN{FS=”:”;while(getline<”/etc/passwd”>0){print $1}}’ data.txtQUOTE:
nawk ‘{getline d; print d”#”$3}’ data.txt
awk首先读入第一行,接着处理getline函数,然后把下一行指定给变量d,再先打印d,由于d后面有换行符,所以后面紧跟的#会覆盖d,后面的$3同样也会覆盖d。
QUOTE:
nawk ‘{getline; print $0”#”$3}’ data.txt
awk首先读入第一行接着处理getline函数,然后把下一行指定给$0,现在的$0已经是下一行内容,后面的#和$3(从$0中取)会覆盖$0的内容。
-bash-3.2$ awk '{print}' 1dpi.txt
2011-12-2306 609
2011-12-2307 1082
2011-12-2308 2474
2011-12-2309 3302
2011-12-2310 19199
2011-12-2311 22994
2011-12-2312 21241
2011-12-2313 37347
2011-12-2314 26617
2011-12-2315 28088
-bash-3.2$ awk '{getline var;print var}' 1dpi.txt
2011-12-2307 1082
2011-12-2309 3302
2011-12-2311 22994
2011-12-2313 37347
2011-12-2315 28088
-bash-3.2$ awk '{getline var;print}' 1dpi.txt
2011-12-2306 609
2011-12-2308 2474
2011-12-2310 19199
2011-12-2312 21241
2011-12-2314 26617
-bash-3.2$
注:看上面A的解释,getline左右无重定向、<,开始执行脚本,读入那么再执行awk后面的{}的时候,已经读入了一行,在这行读入、赋给了var,然后执行
执行getline指令时, 若成功读取记录,它会返回1. 若遇到文件结束, 它返回0; 无法打开文件则返回-1.
利用 while( getline < filename >0 ) {....}可读入文件中的每一笔数据并予处理. 这是awk中用户自行读取数据文件的一个重要模式.
-bash-3.2$ awk '{"cat 1dpi.txt" |getline var;print var}' 2dpi.txt
2011-12-2306 609
2011-12-2307 1082
2011-12-2308 2474
2011-12-2309 3302
2011-12-2310 19199
2011-12-2311 22994
2011-12-2312 21241
2011-12-2313 37347
2011-12-2314 26617
2011-12-2315 28088
-bash-3.2$ cat 2dpi.txt
2011-12-2306 09
2011-12-2307 082
2011-12-2308 474
2011-12-2309 302
2011-12-2310 199
2011-12-2311 2994
2011-12-232 41
2011-12-2313 7347
2011-12-2314 617
2011-12-235 88
-bash-3.2$ cat 1dpi.txt
2011-12-2306 609
2011-12-2307 1082
2011-12-2308 2474
2011-12-2309 3302
2011-12-2310 19199
2011-12-2311 22994
2011-12-2312 21241
2011-12-2313 37347
2011-12-2314 26617
2011-12-2315 28088
-bash-3.2$ awk '{"cat 1dpi.txt" |getline var;print}' 2dpi.txt
2011-12-2306 09
2011-12-2307 082
2011-12-2308 474
2011-12-2309 302
2011-12-2310 199
2011-12-2311 2994
2011-12-232 41
2011-12-2313 7347
2011-12-2314 617
2011-12-235 88
-bash-3.2$ seq 10 | awk '{if(getline tmp)print tmp;print}'
2
1
4
3
6
5
8
7
10
9
#一般就是判断getline的返回值 > 0 的
awk中通过system也可执行shell命令:system会返回状态码
awk 'BEGIN{ system("ls -l") }'
ps:system里面也可以利用awk的变量:system("echo ", $1)
可以参看
-bash-3.2$ awk 'BEGIN{printf "enter your name:";getline < "_";print}'
enter your name:
-bash-3.2$ yang
-bash: yang: command not found
-bash-3.2$ awk 'BEGIN{printf "enter your name:";getline < "_"}{print}'
enter your name:yangkai
yangkai
//强制按ctrl +c
-bash-3.2$ awk 'BEGIN{printf "enter your name:";getline < "_"}{print;exit}'
enter your name:yangkai
yangkai
-bash-3.2$ awk 'BEGIN{printf "enter your name:";getline < ""}{print;exit}'
enter your name:awk: fatal: expression for `<' redirection has null string value
-bash-3.2$ awk 'BEGIN{printf "enter your name:";getline < "_"}{print _;exit}'
enter your name:yangkai
-bash-3.2$
seq -w 1 30 |awk '/3/{for(i=1;1<3;i++){getline}}1'#笔误往往是致命的,还很难检查出来!!!
seq -w 1 30 |awk '/3/{for(i=1;i<3;i++){getline}}1'
-bash-3.2$ seq -w 1 30 | awk '/3/{for(i=1;i<4;i++){getline}}1'
01
02
06
07
08
09
10
11
12
16
17
18
19
20
21
22
26
27
28
29
30
-bash-3.2$
-bash-3.2$ seq -w 1 30 | awk '/3/{for(i=1;i<4;i++){getline}}!/3/'
01
02
06
07
08
09
10
11
12
16
17
18
19
20
21
22
26
27
28
29
-bash-3.2$ seq -w 1 30 | awk '/3/{p=1}!p||p++>3'
01
02
06
07
08
09
10
11
12
16
17
18
19
20
21
22
26
27
28
29
-bash-3.2$
阅读(3478) | 评论(3) | 转发(0) |