【问题标题】:How to compare two different files and extract overlapping data?如何比较两个不同的文件并提取重叠数据?
【发布时间】:2016-07-08 18:38:04
【问题描述】:

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

我目前有两组数据。

第一个看起来像这样(称为 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 的行。

目前,我尝试过使用comm 和join 和grep -f,没有一个给出我想要的解决方案。我认为grep 可能足以完成这项工作,但我不知道正确的选项。如果这个问题还有其他可能的解决方案,请与我分享。谢谢你的时间!

【问题讨论】:

  • 这对于 Python 来说相当容易。你有这方面的经验吗,或者可以接受吗?
  • @Alden 我不熟悉它,但我可以尽力理解代码。不管怎么说,还是要谢谢你! :)

标签: linux shell grep comm


【解决方案1】:

Grep + bash:

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

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

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

【讨论】:

  • 感谢您的回复。我尝试了代码,但生成的文件完全是空白的。我检查了有重叠的数据,所以应该至少有几行。另外,你能解释一下用 ^ 替换 GeneName 的目的吗?谢谢!
  • @DLee grep -v 用于打印所有不匹配的行,我已将其替换为 tail
  • @DLee 你有现实生活中的例子吗?我用我的示例对其进行了测试,它可以正常工作,因此输入可能存在一些问题。
  • @krzyk 我提供的数据是真实的例子,除了我没有发布整个东西,文件太大了。我刚刚发现使用 '=VLOOKUP()' 的 excel 实际上足以做我想做的事。我仍然会用你的代码再试一次。谢谢大家的帮助!!
  • @DLee 好的,但是您在问题中的示例将导致空文件3,因为没有匹配项
【解决方案2】:

你觉得一点 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]。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 2018-04-14
    • 2017-10-01
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多