在squid自动配置脚本里,用到了sed的/r把一个文件的内容插入另一个文件。今天看到awk对两个文件的处理方法,要通过不少运算,不怎么方便。不过作为加深对NR和FNR的不同的理解,还是有些作用。 先说下NR和FNR的不同。 在一次awk中,NR是从头计算到尾的,而FNR是每打开一个文件,就重新计算:

[root@raocl ~]# awk '{print NR,FNR,$0}' ts st
1 1 123 456
2 2 abc def
3 3 ABC DEF
4 4 654 321
5 1 123 456
6 2 abc def
7 3 ABC DEF
8 4 654 321

下面转载一个例子:

[root@raocl ~]# cat a
1000 北京市 地级 北京市 北京市
1100 天津市 地级 天津市 天津市
1210 石家庄市 地级 石家庄市 河北省
1210 晋州市 县级 石家庄市 河北省
1243 滦县 县级 唐山市 河北省
1244 滦南县 县级 唐山市 河北省
[root@raocl ~]# cat b
110000,北京市
120000,天津市
130000,河北省
130131,平山县
130132,元氏县
[root@raocl ~]# awk 'BEGIN{FS="[|,]";OFS=","}NRFNR{print
$1,$2,a[$2]}' a b
110000,北京市,1000
120000,天津市,1100
130000,河北省,
130131,平山县,
130132,元氏县,

解释: NRFNR也就是到文件b的时候,打印文件b的第1、2列和之前创建的数组a[北京市]等。