问题如下:
现在有两个文件如
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
搞定!
现在有两个文件如
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
搞定!