- 论坛徽章:
- 93
|
我这个是在 cygwin 下测试通过的。效率可能不高,如果 lz 有兴趣,可以做如下改进:将数据存放方式改成平衡树,这样查找起来就快多了;或者将查找改为二分查找,也能将O(n)的复杂度降到O(log(n))。- [seesea@UC ~] # bash --version
- GNU bash, version 2.05b.0(1)-release (i686-pc-cygwin)
- Copyright (C) 2002 Free Software Foundation, Inc.
- [seesea@UC ~] # awk -f cc.awk b a
- 1.1.1.10 20 财务一部
- 1.1.1.34 25 财务二部
- 2.2.2.100 30 技术部
- 3.3.3.20 40 人事部
- [seesea@UC ~] # cat a
- 1.1.1.10 20
- 1.1.1.34 25
- 2.2.2.100 30
- 3.3.3.20 40
- [seesea@UC ~] # cat b
- 1.1.1.0 1.1.1.31 财务一部
- 1.1.1.32 1.1.1.63 财务二部
- 2.2.2.0 2.2.2.127 技术部
- 3.3.3.0 3.3.3.63 人事部
- [seesea@UC ~] # cat cc.awk
- FNR==NR {
- add_dept_info($1, $2, $3)
- }
- FNR == 1 && NR != 1 {
- sort_dept_info()
- }
- FNR < NR {
- print $0 OFS find_dept($1)
- }
- function atoinet(ip, __ARGEND__, ret)
- {
- n = split(ip, ar, ".")
- for (i = 1; i <= n; ++i)
- {
- ret = ret*256 + ar[i]
- }
- return ret
- }
- function add_dept_info(ip_start, ip_end, dept_name)
- {
- dept_info[atoinet(ip_start)] = dept_name
- dept_info[atoinet(ip_end) - 1] = dept_name
- }
- function sort_dept_info()
- {
- count = asorti(dept_info, sorted_index)
- }
- function find_dept(ip)
- {
- inet = atoinet(ip)
- for (i = count; i >= 1; --i)
- {
- if (inet >= sorted_index[i])
- return dept_info[sorted_index[i]]
- }
- return "UNDEFINED"
- }
复制代码 |
|