免费注册 查看新帖 |

Chinaunix

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

两文件比较匹配替换问题 总感觉我把问题说不明白呢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-11 10:11 |只看该作者 |倒序浏览
20可用积分
本帖最后由 dahaoshanhe 于 2012-03-11 10:13 编辑

源文件:有两个文件
file1

  1.   SP    2012  421  1     80    a    120    b  160    c
  2.   SP    2012  421  4     80    g    120    b  160    c  560   d   580    e  600   
  3.   SP    2012  234 18     40    t     80    b  120    c  160    d         
复制代码
file2
  1.                                                    
  2.   SP    2012  421  1     80    x   120   y
  3.   SP    2012  234  16    40    d   80    z  120    m     
  4.   SP    2012  421  2     40    j   80    h  120    p  160    h   200   p   
  5.   SP    2012  421  25    40    i   80                  
  6.       
复制代码
文件描述:
两文件,  前四列为标识。从第5列开始,两列为一对。
比较两文件中的第3列,如果第3列相同,或是第3列之间差最小,两个最接近。就将文件2中对后面对应数字后的值与文件1中的进行置换。
目标文件:

  1.   SP    2012  421  1     80    x    120    y  160     c
  2.   SP    2012  421  4     80    h    120    p  160    h  560   d   580    e  600     
  3.   SP    2012  234 18     40    d     80    z  120    m  160    d         
复制代码

最佳答案

查看完整内容

回复 1# dahaoshanhe

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
2 [报告]
发表于 2012-03-11 10:11 |只看该作者
回复 1# dahaoshanhe
  1. [winway@winway test]$ cat awkscr
  2. NR == FNR {
  3.         for (i=5; i<=NF; i+=2) {
  4.                 line[FNR FS $3 FS $i] = $i FS $(i+1)
  5.         }
  6.         linecnt = FNR;
  7.         next;
  8. }

  9. NR > FNR {
  10.         for (i=1; i<=linecnt; i++) {
  11.                 for (j in line) {
  12.                         if (j ~ i FS $3) {
  13.                                 split(line[j], a, FS);
  14.                                 for (k=5; k<=NF; k+=2) {
  15.                                         if ($k == a[1]) {
  16.                                                 $(k+1) = a[2];
  17.                                                 break;
  18.                                         }
  19.                                 }
  20.                                 delete line[j];
  21.                                 find = 1;
  22.                         }
  23.                 }
  24.                 if (find == 1) {
  25.                         find = 0;
  26.                         break;
  27.                 }
  28.         }
  29.         print $0;
  30. }
  31. [winway@winway test]$ awk -f awkscr file2 file1
  32. SP 2012 421 1 80 x 120 y 160 c
  33. SP 2012 421 4 80 h 120 p 160 h 560 d 580 e 600
  34. SP 2012 234 18 40 d 80 z 120 m 160 d
复制代码

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
3 [报告]
发表于 2012-03-11 11:22 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

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


    这个和前几个帖子的问题类似啊

论坛徽章:
0
5 [报告]
发表于 2012-03-11 15:28 |只看该作者
回复 4# yinyuemi


    是啊 是差不多一样的问题   就是那个写的有点乱 ,我重新写个贴。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP