全部博文(7)
分类:
2012-04-25 14:04:54
原文地址:awk之NR & FNR 作者:zooyo
[解析]
由NR=FNR成立,判断当前读入的是第一个文件a,然后使用{a[$2]=$0;next}循环将a文件的每行记录都存入数组a,并使用$2作为下标引用.next,不在执行后面的语句.
由NR=FNR不成立,判断当前读入了第二个文件b,然后跳过{a[$2]=$0;next},对第二个文件b的每一行都无条件执行{print a[$1]FS$2},此时变量$1为第二个文件的第一个字段,与读入第一个文件时,采用第一个文件的$2为数组下标相同.因此可以在此输出该数组的值。下面那种写法是不是更短呢?
第二个例子:
文件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:
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文件,如下所示
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
[解析]
NR==FNR,第一个文件shadow,以$1为下标,将$2的值赋给数组a,next不再执行后面的语句。
NR>FNR,第二个文件passwd,把$1为下标的数组a的值赋给密码x,就是$2。
第三个例子:
cat file1:
0011AAA 200.00 20050321
0012BBB 300.00 20050621
0013DDD 400.00 20050622
0014FFF 500.00 20050401
cat file2:
I0011 11111
I0012 22222
I0014 55555
I0013 66666
规则:比较 file1的1-4字符 和 file2的2-5 字符,如果相同,将file2 的第二列 与 file1 合并 file3
0011AAA 200.00 20050321 11111
0012BBB 300.00 20050621 22222
0013DDD 400.00 20050622 66666
0014FFF 500.00 20050401 55555
[解析]
当NR=FNR时(就是file2文件),以substr(截取)file2文件第一个域的第2个字符开始,以长度为4的字符段为下标,把$2的值存入数组a中,next不再执行后面的语句。
读到第2个文件时候,pattern不再匹配,则执行后面的语句:打印第2个文本的全行,后面增加以$1为下标的数组a的值。
第四个例子:
file1文件
1 0.5 100
10 15 36.5
file2文件
50 10 9
3.2 1 5
将两个文件对应的字段进行相加以后的数字合成一个文件如:
51 10.5 109
13.2 16 41.5
[解析]
把file1中的每个字段用二维下标存放进数组a,当pattern不成立时,执行后面的语句,把file2的每个字段和二维数组的值相加。