awk数组下标的字符串化

    技术2022-05-20  62

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

     


    最新回复(0)