免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2758 | 回复: 8

[文本处理] awk合并两个文本 [复制链接]

论坛徽章:
0
发表于 2014-08-26 22:29 |显示全部楼层
file1:
183042048:183107583:北京
183107584:183173119:上海
183173120:183238655:广州
1031929856:1031995391:深圳
3683909632:3683975167:西安
1940389888:1940455423:杭州
2102919168:2102984703:南京
3395551232:3395616767:长沙

file2:

20140715234918:18052552532:183101605:189mail
20140715234921:18052234605:183101605:189mail
20140810231339:15303102727:3683915556:189mail
20140810231341:15303102727:3683915556:189mail
20140810231342:15303102727:3683915556:189mail
20140810231343:15303102727:3683915556:189mail
20140810231856:13332813036:2102948327:189mail
20140810232008:18950452123:1940409522:189mail
20140810232447:18968999150:1031992900:189mail
20140810232635:13307636911:3395613495:189mail
20140810234919:18052552532:183101605:189mail
20140810234919:18052552532:183101605:189mail
20140810234922:18028728557:183143180:189mail
20140810234924:18962138838:183131274:189mail
20140810234926:18118240426:183101605:189mail
20140810234927:18059377282:183131274:189mail
20140810234927:18059377282:183131274:189mail
20140810234929:18962138838:183131274:189mail
20140810234930:18021738888:183101605:189mail
...

现在我想用awk判断file2中的$3是否在file1 的$1-$2范围内,如果$1<$3<$2,则把file1的$3 合并到file2的相应记录后面

下面是我写的:
awk 'BEGIN {FS=":"} NR==FNR{a[1]=$1;a[2]=$2;a[3]=$3;next}{if($3>a[1] && $3<a[2]) {print $0":"a[3]}}' file1 file2>file3

为什么我只能匹配出一条记录:
20140810232635:13307636911:3395613495:189mail:长沙

其他符合条件的都无法匹配,求大神指点啊

论坛徽章:
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
发表于 2014-08-26 23:00 |显示全部楼层
  1. awk -F: 'NR==FNR{a[$1 FS $2]=$3;next}{for(i in a){split(i,b,FS);if($3>b[1]&&$3<b[2])print $0 FS a[i]}}' file1 file2
复制代码

论坛徽章:
3
金牛座
日期:2013-08-26 10:25:02摩羯座
日期:2013-09-09 15:14:322015年亚洲杯之约旦
日期:2015-05-06 09:33:56
发表于 2014-08-26 23:01 |显示全部楼层

vb wq

本帖最后由 kooleon 于 2014-08-26 23:03 编辑

按你的思路来应该是这样:


awk 'BEGIN {FS=":"} NR==FNR{a[i++]=$1;b[j++]=$2;c[k++]=$3;next}{if($3>a[l++] && $3<b[n++]) {print $0":"c[m++]}}' file1.txt  file2.txt
20140715234918:18052552532:183101605:189mail:北京
20140810231343:15303102727:3683915556:189mail:上海
20140810232447:18968999150:1031992900:189mail:广州
20140810232635:13307636911:3395613495:189mail:深圳


好像有什么地方不对……好吧,我的错了。。。。

论坛徽章:
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
发表于 2014-08-26 23:02 |显示全部楼层
你写的那个太单纯了,等你读完第一个文件时,数组a里只有3个键和值。

论坛徽章:
0
发表于 2014-08-26 23:15 |显示全部楼层
感谢 yestreenstars大神,分析了一下,确实是呢,所以只能匹配出一个,学习了~~~

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
发表于 2014-09-01 17:29 |显示全部楼层
回复 2# yestreenstars


awk -F: 'NR==FNR{a[$1 FS $2]=$3;next}{for(i in a){split(i,b,FS);if($3>b[1]&&$3<b[2])print $0 FS a}}' file1 file2

星辰大神,向您请教几个问题
这里的两个大括号{} 是分别针对file1和file2的动作吗?

论坛徽章:
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
发表于 2014-09-01 18:42 |显示全部楼层
回复 6# super皮波

是的,通过NR==FNR和next语句来指定awk要处理的文件对象。
   

论坛徽章:
14
15-16赛季CBA联赛之辽宁
日期:2019-06-16 15:47:3515-16赛季CBA联赛之广夏
日期:2016-08-13 21:24:352015亚冠之武里南联
日期:2015-07-07 17:37:372015亚冠之萨济拖拉机
日期:2015-07-06 17:07:482015亚冠之全北现代
日期:2015-06-04 13:54:272015亚冠之城南
日期:2015-05-21 15:43:212015年亚洲杯之伊朗
日期:2015-04-25 18:20:362015年亚洲杯之伊朗
日期:2015-04-20 16:06:052015年亚洲杯之科威特
日期:2015-03-07 12:51:26丑牛
日期:2014-12-30 10:26:38申猴
日期:2014-09-28 22:40:18金牛座
日期:2014-09-13 21:12:22
发表于 2014-09-02 01:11 |显示全部楼层
  1. <?php

  2. $fa = file('a');
  3. $fb =file('b');
  4. foreach ($fb as $k => $v) {
  5.    $brr=explode(':', $v);
  6.    foreach ($fa as $kk => $vv) {
  7.       $arr=explode(':', $vv);
  8.       if($arr[0]<$brr[2] && $brr[2]<$arr[1] ){
  9.           echo  trim($v).":".$arr[2];
  10.       }

  11.    }
  12. }

  13. ?>

  14. 结果:

  15. 20140715234918:18052552532:183101605:189mail:北京
  16. 20140715234921:18052234605:183101605:189mail:北京
  17. 20140810231339:15303102727:3683915556:189mail:西安
  18. 20140810231341:15303102727:3683915556:189mail:西安
  19. 20140810231342:15303102727:3683915556:189mail:西安
  20. 20140810231343:15303102727:3683915556:189mail:西安
  21. 20140810231856:13332813036:2102948327:189mail:南京
  22. 20140810232008:18950452123:1940409522:189mail:杭州
  23. 20140810232447:18968999150:1031992900:189mail:深圳
  24. 20140810232635:13307636911:3395613495:189mail:长沙
  25. 20140810234919:18052552532:183101605:189mail:北京
  26. 20140810234919:18052552532:183101605:189mail:北京
  27. 20140810234922:18028728557:183143180:189mail:上海
  28. 20140810234924:18962138838:183131274:189mail:上海
  29. 20140810234926:18118240426:183101605:189mail:北京
  30. 20140810234927:18059377282:183131274:189mail:上海
  31. 20140810234927:18059377282:183131274:189mail:上海
  32. 20140810234929:18962138838:183131274:189mail:上海
  33. 20140810234930:18021738888:183101605:189mail:北京
复制代码

论坛徽章:
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
发表于 2014-09-02 08:55 |显示全部楼层
回复 8# reb00t

充气越来越会拍黄片啦~{:2_172:}
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP