如何比较两个不同的文件并提取重叠数据?

时间:2016-07-08 18:38:05

标签: linux shell grep comm

我是编程世界的新手,所以如果我刚问了一个简单明了的问题,请原谅我。我真的需要很多帮助。

我目前有两组数据。

第一个看起来像这样(称之为file1):

GeneName
TAF13
ZC3H6
RAC3
MED16
FAT3
SCRG1
GRM3
DHX16
LRRN4CL
STMN4
PCDHGA11
RPLP1
WASF1
KATNAL1
FTL1
D8ERTD738E

第二个看起来像这样(称之为“file2”):

GeneName    Chr Start   End SumOfMerge  67_1    67_2    67_3    68_1    68_2    68_3    69_1    69_2    69_3    70_1    70_2    70_3    71_1    71_2    71_3    72_1    72_2    72_3    73_1    73_2    73_3    
LOC100288069    chr1    713126  714875  13  NA  nPk1    nPk1    NA  nPk1    nPk1    NA  NA  nPk1    NA  nPk2    nPk1    NA  nPk1    nPk1    NA  nPk1    nPk1    NA  nPk1    nPk1    
FAM87B  chr1    752176  752900  20  nPk2    nPk3    nPk2    nPk2    nPk3    nPk3    nPk2    nPk3    nPk3    nPk2    nPk4    NA  nPk3    nPk3    nPk3    nPk3    nPk3    nPk2    nPk2    nPk3    nPk3    
LINC00115   chr1    761026  763300  20  nPk7    nPk6    nPk3    nPk7    nPk5    nPk4    nPk7    nPk8    nPk5    NA  nPk5    nPk3    nPk8    nPk6    nPk4    nPk7    nPk7    nPk3    nPk8    nPk7    nPk4    
SAMD11  chr1    858401  862175  20  nPk16   NA  nPk10   nPk16   nPk13   nPk13|nPk14 nPk16   nPk16   nPk13   nPk14   nPk13   NA  nPk18   nPk13   nPk11|nPk12 nPk17   NA  nPk12   nPk17   nPk16   nPk11   
KLHL17|NOC2L    chr1    892751  897375  21  nPk23   nPk14   nPk15   nPk24|nPk25 NA  nPk18   nPk25   nPk20   nPk18   nPk24   nPk18   nPk10   nPk27|nPk28 nPk17   NA  nPk25   nPk18   nPk18   nPk24   nPk20   nPk16   
HES4    chr1    934201  937725  14  nPk30   nPk19   nPk19   NA  nPk24   nPk22   nPk33   nPk25   nPk22   NA  NA  NA  NA  NA  nPk23   nPk32   nPk23   nPk22   NA  nPk25   nPk20   
ISG15   chr1    948076  948750  7   nPk32   NA  NA  nPk33   NA  NA  nPk36   NA  NA  nPk35   NA  NA  nPk37   NA  NA  nPk34   NA  NA  nPk36   NA  NA  
AGRN    chr1    954376  954875  21  nPk34   nPk22   nPk21   nPk36   nPk27   nPk24   nPk38   nPk28   nPk24   nPk37   nPk24   nPk16   nPk39   nPk24   nPk25   nPk36   nPk26   nPk24   nPk38   nPk28   nPk22   
AGRN    chr1    954951  955275  11  NA  NA  nPk22   NA  nPk28   nPk25   NA  nPk29   nPk25   NA  nPk25   nPk17   NA  NA  nPk26   NA  nPk27   nPk25   NA  NA  nPk23   
C1orf159    chr1    1051051 1052500 21  nPk53   nPk38   nPk37   nPk56   nPk42   nPk39   nPk60   nPk42   nPk41   nPk54   nPk38   nPk25   nPk55   nPk40   nPk40   nPk57   nPk45   nPk38   nPk55   nPk50   nPk38   
LINC01342   chr1    1070301 1073175 2   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  nPk40   nPk28   NA  NA  NA  NA  NA  NA  NA  NA  NA  
TTLL10  chr1    1108776 1109450 1   NA  NA  NA  NA  NA  NA  NA  NA  NA  nPk65   Na  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  
TNFRSF4 chr1    1150276 1150750 2   NA  NA  NA  NA  NA  NA  NA  NA  NA  nPk72   NA  NA  nPk72   NA  NA  NA  NA  NA  NA  NA  NA  
SDF4    chr1    1165926 1167475 4   NA  NA  NA  NA  NA  nPk48   NA  NA  NA  NA  NA  NA  NA  NA  nPk50   NA  NA  nPk45   NA  NA  nPk46   

请原谅我,如果第二个数据真的很乱,它实际上是一个包含26个列的数据,每个数据以制表符空格分隔。

我的目标是通过第一列“GeneName”比较file1和file2,并将file2中的行提取到新文件file3。

file3应该看起来像file2,除了只包含与file1具有相同GeneName的行。

目前,我已尝试使用commjoin以及grep -f,但没有人提供我想要的解决方案。我认为grep可能足以完成这项工作,但我不知道正确的选择。如果此问题还有其他可能的解决方案,请与我分享。谢谢你的时间!

2 个答案:

答案 0 :(得分:2)

Grep + bash:

grep -f <(tail -n +2 file1 | sed 's/^/^/g') file2 > file3

这将删除GeneName列(使用tail -n +2跳过第一行 - 从第二行开始打印)并将^(行首的regexp)添加到每个列的开头line - 这样的列表是grep -f匹配行并将它们写入file3的好列表。

这假设您不希望输出中的标题(GeneName)行。

答案 1 :(得分:1)

你对一个小的python代码有什么看法?

#!/usr/bin/python

import sys, re

lookup = {}
for line in open( sys.argv[1] ).readlines():
  lookup[line.rstrip()] = True

for line in open( sys.argv[2] ).readlines():
  s = re.split('[\t ]+', line)
  if len(s) > 0 and s[0] in lookup:
    print( line.rstrip() )

如果文件保存为py.py,则:

chmod 755 py.py
./py.py file1 file2 > file3

此时您可能想稍微调整一下文件以区分大小写?将.lower()添加到查找键和s [0]。