Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1613439
  • 博文数量: 409
  • 博客积分: 6240
  • 博客等级: 准将
  • 技术积分: 4908
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-01 00:04
文章分类

全部博文(409)

文章存档

2021年(1)

2019年(1)

2017年(1)

2016年(13)

2015年(22)

2013年(4)

2012年(240)

2011年(127)

分类: LINUX

2012-01-08 13:36:59

.getline的原文地址:http://blog.nxmeinv.com/post-185.html
小注:
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.txt

QUOTE:
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$ 
阅读(3418) | 评论(3) | 转发(0) |
0

上一篇:sed高级用法

下一篇:kloxo安装

给主人留下些什么吧!~~

ict_wangx2012-11-09 15:45:12

非常感谢您的详细解答。。。祝您事业如神助  

linux_kaige2012-11-05 22:07:22

ict_wangx: 你好,你的总结很好,我有一些疑问想请教一下
1.
seq -w 1  30 | awk '/3/{for(i=1;i<4;i++){getline}}1'
seq -w 1  30 | awk '/3/{for(i=1;i<4;i++){get.....
seq -w 1  30 | awk '/3/{for(i=1;i<4;i++){getline var}}1'
-----seq -w 1 30就不解释了,后面是,awk匹配到3,执行for循环,把有3的第一行,和它下面的两行读入getline变量中,最后的1表示打印其他内容。换个写法应该你就懂了,上面的那个等于:seq -w 1  30 | awk '/2/{for(i=1;i<4;i++){getline var}}{print}' .执行getli

ict_wangx2012-11-01 10:53:32

你好,你的总结很好,我有一些疑问想请教一下
1.
seq -w 1  30 | awk '/3/{for(i=1;i<4;i++){getline}}1'
seq -w 1  30 | awk '/3/{for(i=1;i<4;i++){getline}}!/3/'
后面的1和!/3/是什么意思呢,有什么作用啊
2.
awk ‘{getline d; print d”#”$3}’ data.txt 和 awk ‘{getline ; print $0”#”$3}’ data.txt  这边getline d 然后print d   和 getline  然后 print $0 有什么区别么 ,这边两句话不太懂呢 ~,能详细解释一下么
刚开始学 ,谢谢!