二分查找的awk

1351阅读 0评论2010-11-03 expert1
分类:

本人的回复:
awk '                      
# author :expert1
# last-update:2010-10-18
#
function ip2n(ip) { split(ip,a,"."); return a[1]*256^3+a[2]*256^2+a[3]*256+a[4] }
NR==FNR{t[$1]=$3;b[$1]=$2;next}
  { for (i in t)
     if(ip2n($0)>=i &&ip2n($0) <= t[i])
    
      {print $0 "  in\t" b[i];break}
     
   }' f2 f1
 
原文
 
顺便贴上本人写的二分查找,这2个是同类问题
 
1。首先sort -t\. -k1,1n -k2,2n -k3,3n -k4,4n ip段 >ip_range

2。
  1. awk ' 
  2. #作者:expert1                      
  3. function ip2n(ip) { split(ip,a,"."); return a[1]*256^3+a[2]*256^2+a[3]*256+a[4] }

  4. BEGIN {FS="[-: ]+"}      

  5. NR==FNR {

  6.        fuck[k++] = $0;next }

  7.      {               

  8.         start = 0

  9.         end = k - 1        

  10.         while(start <= end) {

  11.               mid =int(start+ ((end - start)/2))
  12.                 split(fuck[mid], kao)

  13.                 if(ip2n($1) < ip2n(kao[1]))

  14.                         end = mid-1

  15.                 else if(ip2n($1) > ip2n(kao[2]))

  16.                         start = mid+1

  17.                 else {
  18.                        print $0 " in \t\t"fuck[mid]

  19.                         break

  20.                 }

  21.         }
  22. }'  ip_range ip
 
上一篇:补全IP
下一篇:过滤相同的列