Chinaunix

标题: 两文件比较匹配替换问题 总感觉我把问题说不明白呢 [打印本页]

作者: dahaoshanhe    时间: 2012-03-11 10:11
标题: 两文件比较匹配替换问题 总感觉我把问题说不明白呢
本帖最后由 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         
复制代码

作者: winway1988    时间: 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
复制代码

作者: zooyo    时间: 2012-03-11 11:22
提示: 作者被禁止或删除 内容自动屏蔽
作者: yinyuemi    时间: 2012-03-11 13:44
回复 1# dahaoshanhe


    这个和前几个帖子的问题类似啊
作者: dahaoshanhe    时间: 2012-03-11 15:28
回复 4# yinyuemi


    是啊 是差不多一样的问题   就是那个写的有点乱 ,我重新写个贴。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2