我有一个名为“main.txt”的制表符分隔的文件,我试图从许多多个gz文件,称为“chr1.info.gz”,“chr2.info.gz”,“chr3.info”添加信息到这个文件。 gz“等等,其中包含比主文件更多的行。 注意这些文件是使用gzip压缩的,我不能先解压缩并保存,因为它们是巨大的文件(我没有空间来做这个)。@H_404_1@
我想将主文件中名为“name_id”(第6个字段)的列与多个不同文件(第3个字段)中名为“rs_id”的匹配列进行匹配,并添加来自这些文件的附加信息,同时只保留行在主文件中:@H_404_1@
number maf effect se pval name_id 34 0.7844 0.2197 0.0848 0.009585 snp1 78 0.6655 -0.1577 0.0796 0.04772 snp2@H_404_1@
chr1.info.gz是这样的:@H_404_1@
将rhapsody DiffMerge设置为svn merge-tool@H_404_1@
计时器在Windows 7之前合并@H_404_1@
如何从所有子目录合并具有相同名称的文本文件?@H_404_1@
use pos rs_id a1 a2 a3 a4 f 10584 snp34 0 0 0 0 g 10687 snp35 0 0 0 0 t 13303 snp1 0 0 0 0@H_404_1@
chr2.info.gz是这样的:@H_404_1@
use pos rs_id a1 a2 a3 a4 s 13328 snp67 0 0 0 0 g 10612 snp2 0 0 0 0 t 13303 snp10 0 0 0 0@H_404_1@
…等等@H_404_1@
我想从其他文件添加信息的文件main.all.gz:@H_404_1@
number maf effect se pval name_id use pos rs_id a1 a2 a3 a4 34 0.7844 0.2197 0.0848 0.009585 snp1 t 13303 snp1 0 0 0 0 78 0.6655 -0.1577 0.0796 0.04772 snp2 g 10612 snp2 0 0 0 0@H_404_1@
我已经尝试过“join”,但它看起来像它需要解压缩文件,sorting和保存,我得到的消息,我没有足够的空间在这个设备(我不认为我有正确的代码无论如何):@H_404_1@
join -1 6 -2 3 <(zcat main.txt | sort -k6,6) <(zcat chr1.info.gz | sort -k3,3 ) > try.txt@H_404_1@
我已经尝试过使用awk,但是我肯定做了几件事情,因为它给了我一个空文件,而且在使用多个文件的时候遇到困难。@H_404_1@
我已经花了一天的时间,并找不到一个好的解决scheme,你能帮我解决这个问题吗?@H_404_1@
非常感谢你! -F@H_404_1@
在Python中的Unix猫function(cat *> merged.txt)?@H_404_1@
Perforce:基于Linux的3路合并/parsing工具?@H_404_1@
bash:合并由数字文件名sorting的文本文件@H_404_1@
SVN:将本地更改合并到其他工作副本@H_404_1@
我会用Python来做。@H_404_1@
将主文件读入内存中,并使用一个字典(使用name_id作为键)。 然后将每个info.gzip文件进行流式处理,并根据所找到的内容在dict中扩展信息。 (考虑如果您不止一次查找某一行的信息,该怎么办。)@H_404_1@
然后用你需要的格式写出字典。@H_404_1@
#!/usr/bin/env python import gzip from collections import OrderedDict mainData = OrderedDict() # or just {} if order is not important with open('main.txt') as mainFile: pos = None for line in mainFile: elements = line.split() if pos is None: pos = elements.index('name_id') mainHeaders = elements else: mainData[elements[pos]] = elements infoHeaders = None for infoFileName in [ 'chr1.info.gz','chr2.info.gz' ]: with gzip.open(infoFileName) as infoFile: pos = None for line in infoFile: elements = line.split() if pos is None: pos = elements.index('rs_id') if infoHeaders is None: infoHeaders = elements else: if infoHeaders != elements: print "headers in",infoFileName,"mismatch" # maybe abort? else: key = elements[pos] try: mainData[key] += elements except KeyError: pass # this key does not exist in main with gzip.open('main.all.gz','w') as outFile: outFile.write(' '.join(mainHeaders + infoHeaders) + 'n') for key,value in mainData.iteritems(): outFile.write(' '.join(value) + 'n')@H_404_1@
我的结果是这样的:@H_404_1@
number maf effect se pval name_id use pos rs_id a1 a2 a3 a4 34 0.7844 0.2197 0.0848 0.009585 snp1 t 13303 snp1 0 0 0 0 78 0.6655 -0.1577 0.0796 0.04772 snp2 g 10612 snp2 0 0 0 0@H_404_1@
它不会期望或生成制表符分隔的文件(但对所有内容都使用空格)。 您的示例数据看起来不像是制表符分隔;-)但是,您可以将输出代码(最后一行)中的' ' (空格) ' '更改为't'以将制表符用作分隔符。@H_404_1@
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。