# cat ipcitytable 类似下面这样
367656960    367722495    台北
798588928    798605311    北京
798621696    798687231    北京
973996032    974127103    济南
974127104    974180351    贵阳
974180352    974182399    六盘水
974182400    974192639    贵阳
974192640    974198527    南昌
974198548    974200319    南昌
974200320    974200831    九江
## cat ip.txt
367656961
798621697
类似这样
现在想要实现的是 查看ip.txt文本内所有的这个IP地址(2-3W条数据) 在 ipcitytable(3w条数据)这个表中的那个范围内 并打印出城市来 且顺序不打乱
例如
367656961 台北
798621697 北京
以前发过帖子
朋友们给的办法如下:
1 while read i ;do while read a b c; do if [[ i -ge a && i -lt b ]];then echo $i $c;fi;done<ipcitytable.txt;done < ip.txt(注1)
2 awk 'NR==FNR{a[$1]=1;next}{for(i in a) if(i>=$1&&i<=$2) print i,$3}' ip.txt ipcitytable.txt   (注4)
3 awk 'NR==FNR{a[$0]} NR>FNR{for(i in a) if(i>$1&&i<$2) print i,$3}' ip.txt iptable.txt
4 cat ip.txt |while read ip(注3)
  do
  awk -v a=$ip '{if ($1<=a && a<=$2) print a,$3}' ipcitytable(注2)
  done
1和4的执行结果没有问题 就是很慢
3708131877 重庆
2031030739 深圳
1996762933 成都
2014275889 衡水

2和3的结果变成了类似
975658023 上海
975383757 上海
975235733 上海
975657493 上海
975775455 上海
975631003 上海
975223939 上海
有没有比较优化的的shell脚步来实现这个 是否这个这个时候就必须 用perl或者python来解决?



注:

1.
while read i
do
    while read a b c
    do
    if [[ i -ge a && i -lt b ]];then
        echo $i $c
    fi
    done<ipcitytable.txt
done < ip.txt(ip.txt文件中的每行值赋给i,如下两个命令等同)
=
for i in `cat ip.txt`
=
cat ip.txt |while read ip

2.awk -v a=$ip '{if ($1<=a && a<=$2) print a,$3}' ipcitytable
awk,sed都以行为单位读取文件,awk命令不识别系统变量

3.cat ip.txt | while read ip
把文件的每一行的值都赋给变量ip,如果每行都是由空格隔开的多个值则取第一个值

付给ip,read后面可以接多个变量名称
4.awk命令开始从第一个文件逐行读取,HR,FHR代表行记录数,不同的是HR是累加的

,FNR不累加,下一个文件后从0开始