免费注册 查看新帖 |

Chinaunix

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

跨文件,同时多条件部分匹配。。? [复制链接]

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

只要文件一的$2,$3,能分别与文件二的$3,$4的部分匹配即可,不必完全匹配,该怎么匹配呢。。?

输入文件一:需要同时匹配两列的关键字,而且第二列,第三列之间是存在重复记录的
HSA01340        AB014541        AB017119
HSA01341        AB028069        AF125531
HSA01921        NM_014902       HSDJ977B1

输入文件二:
    其中,1)第三列,第四列之间是有重复的。2)这两列中包含有“|”和“.”。3)有的会被“|”划分为四个部分,有的会被划分五个部分。4)有的四部分和五部分内容相同,有些不尽相同
    所以,利用“|”或者“.”进行拆分是不太准确的,因为有时候文件一是匹配文件二的第四部分,有时候是匹配的第五部分

135     -      gi|9257198|ref|NM_017451.1|     gi|20521114|dbj|AB014541.2|      5087    4952    5087    1      
2867   +      gi|20521114|dbj|AB014541.2|    gi|28703753|gb|BC047378.1|       2890    0       2874    1      
135     -      gi|20521114|dbj|AB014541.2|          gi|4239981|dbj|AB017119.1|        2877        2742        2877        1        
117     -       gi|41393589|ref|NM_006716.3|    gi|6563261|gb|AF125531.1|AF125531        1517    0       123     3      
117     -       gi|4996095|dbj|AB028069.1|           gi|6563261|gb|AF125531.1|AF125531        1517        0        123        3
106     +       gi|1004503|gb|H55859.1|H55859   gi|9581785|emb|AL050318.13|HSDJ977B1(譬如此处第四,五部分并不相同)     145068  105442  120256  2
1924    +       gi|34335252|ref|NM_014902.2|     gi|9581785|emb|AL050318.13|HSDJ977B1    145068  7422    39351   8      


需要同时匹配两列里面的内容。

文件一的第二列部分匹配文件二的第三列(file_1$2~/file_2$3/),而同时文件一的第三列部分匹配文件二的第四列(file_1$3~/file_2$4/)。

希望输出的结果文件是:
HSA01340        AB014541        AB017119        135        -        gi|20521114|dbj|AB014541.2|        gi|4239981|dbj|AB017119.1|        2877        2742        2877        1      
HSA01341        AB028069        AF125531        117        -        gi|4996095|dbj|AB028069.1|        gi|6563261|gb|AF125531.1|AF125531        1517        0        123        3   
HSA01921        NM_014902       HSDJ977B1     1924    +       gi|34335252|ref|NM_014902.2|     gi|9581785|emb|AL050318.13|HSDJ977B1    145068  7422    39351   8  
   

最佳答案

查看完整内容

用gi当作分隔符,我是考虑到类似gi|34335252|ref|NM_014902.2| 5007 2083 5007 这样的列,但是按楼主的说法似乎是直接取10列14列

论坛徽章:
0
2 [报告]
发表于 2012-03-24 15:26 |只看该作者
本帖最后由 loveacat 于 2012-03-25 14:16 编辑
怿_mao44 发表于 2012-03-24 15:26
只要文件一的$2,$3,能分别与文件二的$3,$4的部分匹配即可,不必完全匹配,该怎么匹配呢。。?

输入文件 ...

  1. $ awk -vFS="gi" -f awkurfile urfile1
  2. HSA01340        AB014541        AB017119        135     -      gi|20521114|dbj|AB014541.2|          gi|4239981|dbj|AB017119.1|        2877        2742        2877        1
  3. HSA01341        AB028069        AF125531        117     -       gi|4996095|dbj|AB028069.1|           gi|6563261|gb|AF125531.1|AF125531        1517        0        123        3
  4. HSA01921        NM_014902       HSDJ977B1       1924    +       gi|34335252|ref|NM_014902.2|    5007    2083 5007     gi|9581785|emb|AL050318.13|HSDJ977B1    145068  7422    39351   8
复制代码

  1. BEGIN{
  2. while(getline < "urfile2")
  3. a[$2","$3]=$0
  4. FS=" "
  5. }
  6. {
  7. for (item in a)
  8. {
  9. split(item,b,",")
  10. if(b[1]~$2 && b[2]~$3)
  11. {print $0"\t"a[item]}
  12. }
  13. }
复制代码
用gi当作分隔符,我是考虑到类似gi|34335252|ref|NM_014902.2|    5007    2083 5007     这样的列,但是按楼主的说法似乎是直接取10列14列

论坛徽章:
0
3 [报告]
发表于 2012-03-24 15:49 |只看该作者
   实际文件,无论文件一,还是文件二,都不只是只有这么几行,或者几列记录

我是已经为了便于查看后,挑选了几行记录,并删去其中一些没有关联系却字节很长的列

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
4 [报告]
发表于 2012-03-24 21:09 |只看该作者
106     +       gi|1004503|gb|H55859.1|H55859   407     66      178  gi|9581785|emb|AL050318.13|HSDJ977B1(譬如此处第四,五部分并不相同)     145068  105442  120256  2

这行和前几行的格式怎么不一样
407     66      178
  1. [winway@winway test]$ awk 'NR==FNR{a[$2 OFS $3]=$0;next}{f3=gensub(/^.*\|([^|.][^|.]*)\.*[^|]*\|*$/,"\\1","g",$3);f4=gensub(/^.*\|([^|.][^|.]*)\.*[^|]*\|*$/,"\\1","g",$4);if(f3 OFS f4 in a)print a[f3 OFS f4],$0}' file1 file2
  2. HSA01340        AB014541        AB017119  135     -      gi|20521114|dbj|AB014541.2|          gi|4239981|dbj|AB017119.1|        2877        2742        2877        1        
  3. HSA01341        AB028069        AF125531  117     -       gi|4996095|dbj|AB028069.1|           gi|6563261|gb|AF125531.1|AF125531        1517        0        123        3
  4. [winway@winway test]$
复制代码
和你给出的答案有点不一样,每行的末尾少了一串数字

论坛徽章:
0
5 [报告]
发表于 2012-03-25 09:44 |只看该作者
回复 3# winway1988


    是不是我手动在括号内加了一些注释的话语,影响了格式。。

后面的数值还是需要的,实际文件中的每个内容都需要的,而且可能更长。。

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
6 [报告]
发表于 2012-03-25 09:48 |只看该作者
回复 4# 怿_mao44


   
HSA01340        AB014541        AB017119        135        -        gi|20521114|dbj|AB014541.2|        gi|4239981|dbj|AB017119.1|        2877        2742        2877        1        135,        0,        2742,

比如你结果中的这行,行尾的
135,        0,        2742,

我没看出来什么怎么生成的。

论坛徽章:
0
7 [报告]
发表于 2012-03-25 11:21 |只看该作者
回复 5# winway1988


    这个是我手动加错的。。不用管,这个是怪我不小心的。。

只是输出结果是没有错,可是有遗漏的。。实际文件对应的是文件二$10,和$14,题目是删掉一些无关列的,所以才为$3和$4
  1. $ awk 'NR==FNR{a[$2 OFS $3]=$0;next}{f10=gensub(/^.*\|([^|.][^|.]*)\.*[^|]*\|*$/,"\\1","g",$10);f14=gensub(/^.*\|([^|.][^|.]*)\.*[^|]*\|*$/,"\\1","g",$14);if(f10 OFS f14 in a)print a[f10 OFS f14],$0}' fileA fileB |wc -l
  2. 4861
复制代码
但是利用其他的方法,得到的记录数却不一样
  1. awk -f pair.awk fileA |wc -l
  2. 5170

  3. BEGIN{
  4. while (getline < "fileB")
  5. a[$10FS$14]=$0   }
  6. {       for (item in a)
  7.        {       split(item,b)
  8.                if(b[1]~$2 && b[2]~$3)
  9.                 print $0"\t"a[item]
  10.         }
  11. }
复制代码

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
8 [报告]
发表于 2012-03-25 12:02 |只看该作者
本帖最后由 winway1988 于 2012-03-25 12:02 编辑

回复 6# 怿_mao44


    可以看看两种输出不同的行,找找是什么原因引起的。
我怀疑是不是类似这样的行引起的
106     +       gi|1004503|gb|H55859.1|H55859   407     66      178  gi|9581785|emb|AL050318.13|HSDJ977B1     145068  105442  120256  2

这行按你的方法有没有可能匹配fileA里的两行

论坛徽章:
0
9 [报告]
发表于 2012-03-25 12:46 |只看该作者
回复 7# winway1988


    我又添加了这种实例

不过我觉得应该不是这个的影响,因为在结果中,确实找到能匹配这种情况结果的记录

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
10 [报告]
发表于 2012-03-25 13:28 |只看该作者
本帖最后由 winway1988 于 2012-03-25 13:30 编辑

回复 8# 怿_mao44


    像这种情况
  1. [winway@winway test]$ cat fileA
  2. HSA01340        H55859        HSDJ977B1
  3. HSA01341        H55859        AL050318
  4. [winway@winway test]$ cat fileB
  5. 106     +       gi|1004503|gb|H55859.1|H55859    gi|9581785|emb|AL050318.13|HSDJ977B1     145068  105442  120256  2
复制代码
你的方法会输出
  1. [winway@winway test]$ awk -f awkscr fileA
  2. HSA01340        H55859        HSDJ977B1 106     +       gi|1004503|gb|H55859.1|H55859    gi|9581785|emb|AL050318.13|HSDJ977B1     145068  105442  120256  2   
  3. HSA01341        H55859        AL050318  106     +       gi|1004503|gb|H55859.1|H55859    gi|9581785|emb|AL050318.13|HSDJ977B1     145068  105442  120256  2  
复制代码
我的方法会输出
  1. [winway@winway test]$  awk 'NR==FNR{a[$2 OFS $3]=$0;next}{f3=gensub(/^.*\|([^|.][^|.]*)\.*[^|]*\|*$/,"\\1","g",$3);f4=gensub(/^.*\|([^|.][^|.]*)\.*[^|]*\|*$/,"\\1","g",$4);if(f3 OFS f4 in a)print a[f3 OFS f4],$0}' fileA fileB
  2. HSA01340        H55859        HSDJ977B1 106     +       gi|1004503|gb|H55859.1|H55859    gi|9581785|emb|AL050318.13|HSDJ977B1     145068  105442  120256  2  
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP