Python - 如何对文件中的行进行排序以匹配另一个文件排序顺序

时间:2016-04-22 14:41:50

标签: python-3.x matching

我有两个文件:A&乙

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

这是文件A的格式(已排序的文件):

#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中获取重要信息。

基本上我的输出(我们称之为文件C)应如下所示:

#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中完成吗?我对编程很陌生,但有了一些帮助,我应该能够使这个工作。这也是我在工作中做的一项非常普遍的任务,因此将这个脚本放在未来将是非常棒的!

谢谢!

1 个答案:

答案 0 :(得分: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)] )