免费注册 查看新帖 |

Chinaunix

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

求大神出手相助,解决文件匹配问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-11-28 17:40 |只看该作者 |倒序浏览
输入文件1:
1.1        PS.lightreaction                       
1.1.1        PS.lightreaction.photosystem II                       
1.1.1.1        PS.lightreaction.photosystem II.LHC-II        ppa009686m.g         LHCB4.3 (light harvesting complex PSII); chlorophyll binding        
1.1.1.1        PS.lightreaction.photosystem II.LHC-II        ppa010511m.g         LHCA1; chlorophyll binding        
1.1.1.1        PS.lightreaction.photosystem II.LHC-II        ppa010195m.g         LHCB6 (LIGHT HARVESTING COMPLEX PSII SUBUNIT 6); chlorophyll binding        
1.1.1.2        PS.lightreaction.photosystem II.PSII polypeptide subunits        ppa022268m.g         PPL2 (PsbP-like protein 2); calcium ion binding        
1.1.1.2        PS.lightreaction.photosystem II.PSII polypeptide subunits        ppa013107m.g         PSBR (photosystem II subunit R)        
1.1.1.2        PS.lightreaction.photosystem II.PSII polypeptide subunits        ppa010370m.g               
1.1.1.3        PS.lightreaction.photosystem II.biogenesis                       
1.1.1.4        PS.lightreaction.photosystem II.LHC biogenesis                       
1.1.2        PS.lightreaction.photosystem I                       
1.1.2.1        PS.lightreaction.photosystem I.LHC-I        ppa011981m.g         OHP2 (ONE-HELIX PROTEIN 2)        
1.1.2.1        PS.lightreaction.photosystem I.LHC-I        ppb013740m.g         LHCA6; chlorophyll binding        
1.1.2.2        PS.lightreaction.photosystem I.PSI polypeptide subunits        ppa012567m.g         PSAG (PHOTOSYSTEM I SUBUNIT G)        
1.1.2.2        PS.lightreaction.photosystem I.PSI polypeptide subunits        ppa011229m.g         PSAL (photosystem I subunit L)        
1.1.2.2        PS.lightreaction.photosystem I.PSI polypeptide subunits        ppa010953m.g         PSAF (photosystem I subunit F)        
。。。
此处略去万行。
输入文件2:
geneID
ppa010511m.g        LHC
ppa013107m.g        PS
ppa011229m.g        PSA
。。。
此处略去万行。
输入文件3:
geneID        0d_1        0d_2        0d_3        CC5d_1        CC5d_2        CC5d_3        CC7d_1        CC7d_2
ppa009686m.g        2.004282278        1.42647568        1.530308868        1.827674515        1.313072189        1.471673537        1.830757203        1.706259134
ppa010195m.g        18.3712211        13.83512677        17.12123692        25.92180373        24.1488201        25.28041643        31.60035577        29.2534205
ppa010511m.g        7.071188751        4.70447866        5.424637408        2.548750222        2.165637066        2.129566259        2.981546835        3.027793736
ppa022268m.g        52.53410985        37.93052821        46.28323418        25.29563517        22.38356599        23.60107647        25.54592884        26.64492136
ppa013107m.g        18.98126579        11.74118123        14.06679527        25.8771082        23.75373785        21.65753427        37.14455883        32.12428506
ppa010370m.g        23.62378358        15.72410298        18.56895804        7.460963559        6.59120778        6.663066851        9.578208164        9.564691673
ppa011981m.g        4.205179214        2.702044723        3.257905641        2.928045721        1.979196723        2.53870006        2.692839371        2.891387921
ppb013740m.g        42.29592939        29.16129248        31.67579759        37.82431097        33.3812292        35.87154046        46.08085155        44.200645
ppa012567m.g        49.00744956        33.12091871        39.19947173        41.20533567        36.40348659        36.98597847        49.23566751        44.52914897
ppa011229m.g        19.97384668        13.88835717        16.88478369        10.52000849        10.15691059        9.43541958        13.38839046        12.48115898
ppa010953m.g        42.7478877        38.23237308        52.30138312        79.03127445        75.42824506        77.57145976        61.51771359        54.14064048

.......................................此处略几万行。


想做到以下的效果:如果文件2的某个第1列geneID匹配到文件1的第三列的geneID,输出文件one:文件2的第2列注释和文件1第一列具有相同编号的所有行;输出文件two:输出文件one第3列的id在输入文件3中匹配的所有行

例如:如文件2第1行是ppa010511m.g        LHC,匹配到文件1的1.1.1.1        PS.lightreaction.photosystem II.LHC-II        ppa010511m.g         LHCA1; chlorophyll binding,于是输出所有是1.1.1.1的行,即文件one:

1.1.1.1        PS.lightreaction.photosystem II.LHC-II        ppa009686m.g         LHCB4.3 (light harvesting complex PSII); chlorophyll binding        
1.1.1.1        PS.lightreaction.photosystem II.LHC-II        ppa010511m.g         LHCA1; chlorophyll binding        

由上输出得到的geneID是ppa009686m.g和ppa010511m.g,在文件3中,匹配得到文件two:

ppa009686m.g        2.004282278        1.42647568        1.530308868        1.827674515        1.313072189        1.471673537        1.830757203        1.706259134
ppa010511m.g        7.071188751        4.70447866        5.424637408        2.548750222        2.165637066        2.129566259        2.981546835        3.027793736


请大神施以援手,老板催着要结果,我还是编程小白。尝试着用python和perl解决,但终究在报错中放弃。在此希望得到高人相助,感激不尽。在此先谢过了。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2015-11-28 20:42 |只看该作者
回复 1# 321wangke321


    参考这个:

data1.txt 对应文件 1; data2.txt 对应文件 3;keys.txt 对应文件 2.

#!/usr/bin/env python3

import sys
import os
import tempfile

def load_data1(filename):
    number_of, lines_of = {}, {}
    with open(filename) as file:
        for line in file:
            fields = line.split('\t')
            if len(fields) > 2:
                number = fields[0]
                geneid = fields[2]
                number_of[geneid] = number
                if fields[0] in lines_of:
                    lines_of[number].append([geneid, line])
                else:
                    lines_of[number] = [[geneid, line]]
        return number_of, lines_of

def load_data2(filename):
    line_of = {}
    with open(filename) as file:
        for line in file:
            geneid = line.split(maxsplit=1)[0]
            line_of[geneid] = line
        return line_of

def main():
    """"Usage: p data1.txt data2.txt keys.txt"""

    number_of, data1_lines_of = load_data1(sys.argv[1])
    data2_line_of = load_data2(sys.argv[2])

    with open(sys.argv[3]) as file:
        for line in file:
            geneid = line.split(maxsplit=1)[0]
            if geneid not in number_of:
                continue
            number = number_of[geneid]

            print("Part one of " + geneid)
            data1_lines = [item[1] for item in data1_lines_of[number]]
            path1 = os.path.join(tempfile.gettempdir(), geneid) + "-one.txt"
            with open(path1, mode='w') as file1:
                for line1 in data1_lines:
                    file1.write(line1)

            print("Part two of" + geneid)
            data1_geneids = [item[0] for item in data1_lines_of[number]]
            path2 = os.path.join(tempfile.gettempdir(), geneid) + "-two.txt"
            with open(path2, mode='w') as file2:
                for geneid1 in data1_geneids:
                    if geneid1 in data2_line_of:
                        file2.write(data2_line_of[geneid1])

            print("")


if __name__ == '__main__':
    main()

论坛徽章:
0
3 [报告]
发表于 2015-11-29 00:16 |只看该作者
MMMIX 发表于 2015-11-28 20:42
回复 1# 321wangke321

出现以下报错信息:

$ python 根据诱饵基因提取mapman基因家族ID和表达量.py data1.txt data2.txt keys.txt
Traceback (most recent call last):
  File "根据诱饵基因提取mapman基因家族ID和表达量.py", line 60, in <module>
    main()
  File "根据诱饵基因提取mapman基因家族ID和表达量.py", line 32, in main
    data2_line_of = load_data2(sys.argv[2])
  File "根据诱饵基因提取mapman基因家族ID和表达量.py", line 24, in load_data2
    geneid = line.split(maxsplit=1)[0]
TypeError: split() takes no keyword arguments

论坛徽章:
0
4 [报告]
发表于 2015-11-29 12:01 |只看该作者
回复 3# 321wangke321


geneid = line.split(maxsplit=1)[0]
TypeError: split() takes no keyword arguments


add a keyword


geneid = line.split(keyword, maxsplit=1)[0]

论坛徽章:
0
5 [报告]
发表于 2015-11-29 13:00 |只看该作者
MMMIX 发表于 2015-11-28 20:42
回复 1# 321wangke321

应该是版本问题,我修改成geneid = line.split('\t',1)[0]就正常了。感谢大神的悉心指导,您真是好人啊。在此膜拜一下

论坛徽章:
0
6 [报告]
发表于 2015-11-29 13:01 |只看该作者
питон 发表于 2015-11-29 12:01
回复 3# 321wangke321

谢谢,我修改成geneid = line.split('\t',1)[0]就正常了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP