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) |