2016-04-22 74 views
-1

我有两个文件:一个& B.Python的 - 如何在一个文件中匹配另一个文件中的行排序排序顺序

文件是制表符分隔的,具有特定的排序顺序。我想对文件B中的所有行进行排序,以便两个文件中的所有行完全匹配。

这里是文件(即排序的文件)的格式:

#chr #start  #end  #name      #score #strand 
chr1 161427010 161427243 Larp7-Chip.MACS2_peak_9704 0.0 . 
chr1 161423805 161424053 Larp7-Chip.MACS2_peak_9703 0.0 . 
chr1 161429385 161429489 Larp7-Chip.MACS2_peak_9705 0.0 . 

下面是文件B(我要排序的文件)的格式:

#chr #start  #end  #name   #score #strand #genechr #genestart #geneend #genename #genescore #genestrand 
chr1 1057669 1058006 Larp7-Chip.MACS2_peak_175 0 . chr1 1017198 1051736 C1orf159 0 - 
chr1 1058881 1058914 Larp7-Chip.MACS2_peak_176 0 . chr1 1017198 1051736 C1orf159 0 - 
chr1 1063389 1063653 Larp7-Chip.MACS2_peak_181 0 . chr1 1072397 1079434 LINC01342 0 + 

由于你可以看到文件B有比文件A更多的信息,这就是为什么我需要匹配排序顺序,这样我就可以从文件B awk重要的信息。

本质上是我的输出(我们将其称为文件C) SH乌尔德这个样子:

#chr #start  #end  #name      #score #strand #genechr #genestart #geneend #genename #genescore #genestrand 
chr1 161427010 161427243 Larp7-Chip.MACS2_peak_9704 0 . chr1 161475205 161489360 FCGR2A 0 + 
chr1 161423805 161424053 Larp7-Chip.MACS2_peak_9703 0 . chr1 161475205 161489360 FCGR2A 0 + 
chr1 161429385 161429489 Larp7-Chip.MACS2_peak_9705 0 . chr1 161475205 161489360 FCGR2A 0 + 

注意:我不能使用的第四列匹配和排序的文件。有多个重复项,因此会导致问题。排序顺序必须与前三列匹配。

编辑:为了清楚起见,文件A具有关于人类基因组中增强子区域的信息。文件B具有相同的增强子信息,但是具有关于与每个增强子区域相邻的相关基因的额外信息。

我想输出一个新的文件,它具有文件B中的所有信息,但遵循与文件A相同的行顺序。两个项目的数量相同。

这是可能在Python 3中做的吗?我对编程颇为陌生,但有了一点帮助,我应该可以做到这一点。这也是我在工作中非常常见的任务,所以让这个脚本为将来铺设好将是非常棒的!

谢谢!

+0

排序依据是什么?我不明白订单... – Bharel

+0

前6列是为了显示增强子区域在人类基因组中的位置。第二组6列显示它们相关的附近基因。 我想要排序,以便输出文件具有与文件A相同的行顺序(相同的前6列),但有来自文件B的相关基因的信息。我把一个编辑在主要帖子尝试并澄清一点,如果这不完全有帮助,我很抱歉。 – System

+0

如果您给每种文件格式的列名称,它可能会更容易(理解问题更有帮助)。目前,您可以参考*前三列*,这两列文件中包含不同的数据。回想一下关系数据库:确定一个候选关键字。 – dhke

回答

1

我认为前6周的cols是足以唯一标识您的记录:

def getKey (x): 
    keys = x.split()[0:6] 
    keys[4] = float(keys[4]) 
    return tuple(keys) 
rows_of_fileB = dict([ getKey(r), r] for r in fileB) 
for row in fileA: 
    print(rows_of_fileB[getKey(row)]) 
+0

我得到一个 'KeyError:getKey = lambda x:tuple(x.split()[0:6]) rows_of_fileB = dict([getKey(r),r] for fileB) for row in fileA: print(rows_of_fileB [getKey(row)])' at line 7. 这可能是因为我打开我的文件不正确。我正在使用'FileA = open(“FileA.txt”)'和'FileB = open(“FileB.txt”)'。我对Python很新,所以这可能不合适。编辑:是的,你的假设前6列足以识别记录是正确的。 – System

+0

也许文件A中有一些行中没有对应的行(前6个列不匹配)。该错误消息将为您提供该行的前6列。 – gdlmx

+0

嗯,我实际上认为它们的区别可能在于文件A有0.0的浮点数,而文件B有0的得分。我会解决这个问题并重新运行。 – System

相关问题