大家好,我是陆砚码。今天我们来聊聊awk中的NR、FNR和next这三个小家伙。它们虽然不起眼,但在处理文本文件时可是大有用处哦!
NR和FNR
NR是啥?NR表示awk开始执行程序后所读取的数据行数。简单来说,就是已经处理过的行数。
FNR呢?FNR和NR长得差不多,但它们的作用可不一样。FNR是每次打开一个新文件时,行数从0开始重新累计的。也就是说,每次处理新文件,FNR都会重置为0。
示例1:文件合并
我们先来看一个例子,假设我们有两个文件file1和file2,我们要比较file1的1-4字符和file2的2-5字符,如果相同,就将file2的第二列和file1合并到file3中。
awk -F'[ a-zA-Z]' 'NR==FNR{a[$2]=$4;next}{print $0,a[$1]}' file2 file1
这里,我们首先设定域分隔符为空格或者是匹配a-zA-Z正则的一个字母。当NR==FNR,读取file2的时候构建一个数组,下标是第2个域,值是第4个域。然后遇到next命令,不再执行后面的语句,循环读取新的一行继续执行构建数组的命令,直到NR==FNR失败。
当NR==FNR为false的时候,读取file1,输出file1中的所有内容,再输出a[$1]。因为file1中$1的值和file2中$2的值是相同的,所以a[$1]等于我们前面设定的file中$2的值,最终得到上面的结果。
示例2:文件替换
再来看一个例子,假设我们有两个文件passwd和shadow,我们要用shadow文件中的密文部分替换passwd中的
