2016-04-22 71 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

相關問題