免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3592 | 回复: 19
打印 上一主题 下一主题

[文本处理] awk问题请教:2个文件的比较 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-16 11:46 |只看该作者 |倒序浏览
本帖最后由 nxzwt 于 2013-01-16 19:24 编辑

有2个文件a和b
a的内容如下,有100多万行
1.1.1.10     20
1.1.1.34     25
2.2.2.100   30
3.3.3.20     40
b的内容如下,有1万多行
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     人事部

要求从a里面读出数据,和b比较后输出成
1.1.1.10    20    财务一部
1.1.1.34    25    财务二部
2.2.2.100   30   技术部
3.3.3.20    40    人事部

这个用awk该怎么做?请高手指点,谢谢!!

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2013-01-16 13:25 |只看该作者
回复 1# nxzwt

  1. awk 'NR==FNR{b[a[match($1,/(.*)\.[^.]+$/,a)]]=$0;next}{print b[c[match($1,/(.*)\.[^.]+/,c)]],$NF}' a b
复制代码

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
3 [报告]
发表于 2013-01-16 13:27 |只看该作者
  1. awk -F '[ .]+' 'NR==FNR{a[$1"."$2"."$3]=$9}NR>FNR{for(i in a)if($1"."$2"."$3==i)print $0,a[i]}' b a
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
4 [报告]
发表于 2013-01-16 14:18 |只看该作者
@yinyuemi@Shell_HAT两位是否忽略了范围?比如文件a的第一行,1.1.1.10中的第4位10必须在文件b的范围0-31才能对应财务部。

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
5 [报告]
发表于 2013-01-16 14:31 |只看该作者
回复 4# yestreenstars


    看楼主怎么回复吧

论坛徽章:
0
6 [报告]
发表于 2013-01-16 15:17 |只看该作者
本帖最后由 nxzwt 于 2013-01-16 15:19 编辑

非常感谢几位关注!!

情况是:a文件有100多万行,记录了IP地址和某个统计次数,比对是把a里面的IP地址和b记录的IP地址段结果进行比对,要求核实a里面的ip地址落到b记录的哪个部门,确实需要10在0-31之间这个情况。

论坛徽章:
0
7 [报告]
发表于 2013-01-16 15:24 |只看该作者
测试了2位大侠的代码,不知为何不能产生正确的结果。

论坛徽章:
0
8 [报告]
发表于 2013-01-16 17:58 |只看该作者
回复 7# nxzwt


    文件b有多少行

论坛徽章:
0
9 [报告]
发表于 2013-01-16 18:09 |只看该作者
本帖最后由 07101060407 于 2013-01-16 18:19 编辑

awk 'BEGIN{FS="[.]|[ ]+|\t+"}NR==FNR{min[NR]="0."$1$2$3$4;max[NR]="0."$5$6$7$8;name[NR]=$9;l=(NR>l)?NR:l}NR!=FNR{a="0."$1$2$3$4;for(i=1;i<=l;i++){if(a<=max&&a>=min)print $0,name}}' b a


我这个有问题
0.0.0.10和0.0.0.1是相等的

论坛徽章:
0
10 [报告]
发表于 2013-01-16 19:23 |只看该作者
文件b有1万行
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP