awk数组下标的字符串化

问题如下:

现在有两个文件如
A文件
2 sdf
30 sf
15 sdf

B文件
0 20 sdfsf
21 56 sdfsadfsf
57 200 sdflj
201 500 sfasfd

A中记录是不连续的,B中记录是连续全面的.现在要把A文件中的第一列放到B文件中与第一第二列对比,看在哪个范围内,符合,则把A中第一列及相应的B文件中第三列打出。

awk的一种做法为:

awk 'NR==FNR{a[$1]=$2} NR>FNR{for(i in a) if($1<=i&&i<=$2) print i,$3}' a b

执行后得结果:
15 sdfsf
2 sdfsf
30 sdfsadfsf
30 sfasfd


最后两行很难解释。很明显,30<201,怎么还会打印出 30 sfasfd???

经过测试,终于发现原因。原来,awk数组下标都会当作字符串来处理,比如下面的例子:
awk 'BEGIN{a[2]=1;b[10]=2;for(m in a) for(n in b) if(m>n)print m,n,"Yes"}'
执行结果为:
2 10 Yes
从字符串角度看,“2”>"10"。
这样,只需将字符串经过 “加0”转化为数字就OK了。
改为:

awk 'NR==FNR{a[$1]=$2} NR>FNR{for(i in a) if($1<=(i+0)&&(i+0)<=$2) print i,$3}' a b
执行结果:
15 sdfsf
2 sdfsf
30 sdfsadfsf

搞定!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值