awk多脚本代码段运行顺序及next用途

2018年07月19日 2774点热度 0人点赞

0、说明

  也是在写上篇awk文章时,因为漏写了next,输出结果出现了问题,才发现的awk脚本执行顺序及next作用,这里做下记录



1、awk脚本执行顺序

1.1、首先还是创建两个测试文件



1.2、执行awk脚本

  本来是想根据user.txt和group.txt文件,使用awk处理后直接输出:姓名,员工编号,部门名称 这三段信息的

  虽然上面脚本输出也包含了需要的三段信息,但是和我想象中有点出入(第一行按照我的理解,因为user.txt文件中有group.txt文件中部门编号为10的部门,应该会正常输出张三,A0024,IT部的)不应该输出,张三。。就算有单列的也应该输出的部门名称(因为group.txt有的部门在user.txt中没有对应的员工属于该部门,所以后面group.txt应该有输出未定义的数组下标的值,所以输出会有空的)。

  仔细查看上面运行的代码,根据输出结果发现是处理第一行数据时由于我第一段代码{Z[$3]=$2","$1}满足条件NR==FNR被执行后,向下继续执行了{print Z[$1]","$2}脚本,才有上面第一行,张三的输出(前面Z[$3]=$2","$1定义了数组Z下标为10的值=张三,A0024 ; 后面print Z[$1]","$2输出了Z[A0024]"张三" ,因为并没有定义数组Z下标为A0024的值,所以此处被替换为空,所以只打印了,张三)。

  上面说明了,当满足脚本条件时(没有定义条件则顺序全部都执行),awk会对读入文件的每一行数据顺序执行全部定义的脚本(即''单引号包括起来那一大段里面{}分开的一个一个小节)。

  如果想要避免上面的情况发生(每读一行就打印一行肯定是不行的,要读完user.txt文件,定义好数组才能根据group.txt文件打印对应信息),可以给第二段脚本加条件(NR>FNR):当第符合条件NR==FNR执行完{Z[$3]=$2","$1}脚本后,必须符合条件NR>FNR才能继续向下执行{print Z[$1]","$2}这段脚本,否则将处理下一行数据。



2、next作用及使用示例

  这里其实也可以不加NR>FNR判断,要想避免读入第一个文件时直接运行后面{print Z[$1]","$2}脚本,还可以给第一段脚本加上next。效果是一样的并且还省去了后面的判断(当运行脚本时遇到next将直接跳过next后面的脚本,开始处理下一行数据),当符合NR==FNR条件时,将会执行后面{Z[$3]=$2","$1;next}脚本段,运行完前面Z[$3]=$2","$1后碰到next将跳过后面所有脚本,开始处理下一行数据。一直到第一个文件处理完毕,读入第二文件时,NR==FNR条件不匹配,将会执行下一个代码段{print Z[$1]","$2} 直到文件结束。



Chen

健康 · 开心 · 做自己