Chinaunix首页 | 论坛 | 博客
  • 博客访问: 35409
  • 博文数量: 7
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 75
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-10 12:25
文章分类

全部博文(7)

文章存档

2016年(1)

2015年(6)

我的朋友

分类: LINUX

2015-07-31 14:06:58

awk '{if(FNR!=1)print s;s=$0}' a b c
一言以蔽之:
        这里不得不说一下awk执行命令的顺序,首先awk抓取文件第一行内容,然后执行{}内命令,然后再抓取下一条语句,接着再执行{}内命令,如此反复,好了铺垫结束了,我要认真讲了。
        当敲下回车时,awk抓取文件a的第一行内容,此时FNR=1,$0内装载第一行内容。
        然后开始执行{}内的命令,命令分为两部分,以";"分开,按照从左向右(>>)顺序执行。
                第一条语句是在FNR不等于1的情况下执行的,因为开始时FNR=1,所以此时这条语句不执行;
                第二条语句开始执行,就是将$0内文件a的第一行内容赋给s,这里要特别注意,在赋值以前s是没有任何值的,即为空值,也就是说啥也没有,空空荡荡,嗡嗡作响~~(举个例子,我如果把语句改了:awk '{print s;s=$0}' a b c,我把if语句去掉了,此时让我们再从头开始,当你敲下回车时,print s语句执行的结果是啥也没有,即为空,空空荡荡 -_-! )

        接下来就是awk抓取文件a的第二行内容,此时FNR=2,$0内装载第二行内容,Ladies and gentlemen 注意了,这时候s里面装的是第一行的内容奥。
        然后开始执行{}内的命令,命令分为两部分,以";"分开,按照从左向右(>>)顺序执行。
                第一条语句:此时FNR=2,符合条件,执行print s命令(打印的是文件a的第一行内容奥)
                第二条语句开始执行,就是将$0内文件a的第二行内容赋给s
        .
        .
        .
        就这样一直到了awk抓取文件a最后一行内容的关键时刻了,假设a文件有4行,此时大家猜猜FNR等于几啊,当然是4了,$0里面装的也是第四行的内容奥。
        然后开始执行{}内的命令,命令分为两部分,以";"分开,按照从左向右(>>)顺序执行。
                第一条语句:此时FNR=4,符合条件,执行print s命令(打印的是文件a的第三行内容奥)
                第二条语句开始执行,就是将$0内文件a的第四行内容赋给s

        不要打盹奥,因为从这一段开始awk就要抓取文件b的第一行内容了,(每次看到想看的帖子,却又耐不住楼主唠叨得想打瞌睡的时候,我都想掐死他),此时FNR=1,对,你没有看错,就是变成1了,你若不知道为什么就到这里看看                 第一条语句:此时FNR=1,不符合条件,与拒不执行(但是此刻s里面存着的是文件a的最后一行的内容)
                第二条语句:将$0内存着的文件b的第一行内容赋给s

        往下的内容就是不断地重复了,直到awk抓取了文件c的最后一条语句,假设文件c有四行内容,此时FNR=4,$0=4,但是注意s里面此时装载了文件c的第三条语句。
        然后开始执行{}内的命令,命令分为两部分,以";"分开,按照从左向右(>>)顺序执行。
                第一条语句:此时FNR=4,符合条件,执行print s命令(打印的是文件c的第三行内容奥)
                第二条语句开始执行,就是将$0内文件c的第四行内容赋给s
        到此,整个awk语句执行完毕(大家可以看到文件c的第四行没有被打印出来,其实你仔细看一遍的话,你会发现文件a和b的最后一行也没有被打印出来)
        那么写到这里,本条语句的用途已经很明显了,来跟我一块说出来!那就是:将多个文件的最后一行去掉然后合并到一块(能一字不落的看完此博文的人,老衲赞你是人才)
阅读(1715) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~