awk的NR、FNR、next的用法
NR:表示awk开始执行程序后所读取的数据行数。FNR:与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计。下面给出2个示例,展示awk的NR、FNR、next的用法。示例1:文件file1内容:$ cat file0012BBB 300.00 200506210013DDD 400.00 200506220014FFF 500.00 20050401文件file2内容:cat
NR:表示awk开始执行程序后所读取的数据行数。
FNR:与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计。
下面给出2个示例,展示awk的NR、FNR、next的用法。
示例1:
文件file1内容:
$ cat file1
0011AAA 200.00 20050321
0012BBB 300.00 20050621
0013DDD 400.00 20050622
0014FFF 500.00 20050401
文件file2内容:
cat file2
I0011 11111
I0012 22222
I0014 55555
I0013 66666
规则:比较 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个域(拿第1行来举例,就是:a[0011]=11111), 然后遇到next命令,不再执行后面的语句,循环读取新的一行继续执行构建数组的命令,直到NR==FNR失败。
当NR==FNR为false的时候,读取 file1,输出file1中的所有内容,再输出a[$1]。因为file1中 $1的值和file2中$2的值是相同的,所以a[$1]等于我们前面设定的 file中a[$2]的值,最终得到上面的结果。
结果如下所示:
0011AAA 200.00 20050321 11111
0012BBB 300.00 20050621 22222
0013DDD 400.00 20050622 66666
0014FFF 500.00 20050401 55555
示例2:
文件passwd内容:
cat passwd
s2002408030068:x:527:527::/home/dz02/s2002408030068:/bin/pw
s2002408032819:x:528:528::/home/dz02/s2002408032819:/bin/pw
s2002408032823:x:529:529::/home/dz02/s2002408032823:/bin/pw
文件shadow内容:
cat shadow
s2002408030068:$1$d8NwFclG$v4ZTacfR2nsbC8BnVd3dn1:12676:0:99999:7:::
s2002408032819:$1$UAvNbHza$481Arvk1FmixCP6ZBDWHh0:12676:0:99999:7:::
s2002408032823:$1$U2eJ3oO1$bG.eKO8Zupe0TnyFhWX9Y.:12676:0:99999:7:::
用shadow文件中的密文部分替换passwd中的"x",生一个新passwd文件,命令为:
awk -F':' 'NR==FNR{a[$1]=$2;next}{gsub($2,a[$1]);print $0}' shadow passwd
首先,设定域分隔符为":" 。
当NR==FNR,读取shadow,构件数组a,下标为$1,值为$2,通过next命令控制shadow文件读取。
然后,读取passwd文件,通过gsub命令进行全局替换。将passwd中的第2字段替换成a[$1]的值,然后用print进行输出(注意:sub、gsub函数都是会改变原始内容的)。
结果如下所示:
s2002408030068:$1$d8NwFclG$v4ZTacfR2nsbC8BnVd3dn1:527:527::/home/dz02/s2002408030068:/bin/pw
s2002408032819:$1$UAvNbHza$481Arvk1FmixCP6ZBDWHh0:528:528::/home/dz02/s2002408032819:/bin/pw
s2002408032823:$1$U2eJ3oO1$bG.eKO8Zupe0TnyFhWX9Y.:529:529::/home/dz02/s2002408032823:/bin/pw
更多推荐
所有评论(0)