2014-06-16 62 views
-2

我有一個文本文件,它看起來是這樣的:文本文件操作(AWK的Python?)

Chr1 29901 C T 0/0:0,21,143:7:36 0/0:0,3,35:21:18 0/0:0,123,188:41:99 1/0:23,188,12:41:99 1/1:184,75,0:25:54 
Chr1 A G 1/0:23,188,12:41:99 1/1:184,75,0:25:54, 0/0:0,21,143:7:36 0/0:0,3,35:21:18 0/0:0,123,188:41:99 
… 

,凡存在的一般信息4列,那麼許多列(樣本)編碼像0/0:0,21,143:7:36

對於樣品的每個細胞,我想確定是否最後兩個數字的細胞(由冒號分隔)滿足兩個標準。第一個數字必須大於19,第二個數字必須大於29(即:>19:>29)。

如果這兩個標準都不符合,我想用X替換這個單元格。如果滿足這兩個條件,那麼對於每一行,我想用兩個字母來替換單元格,這兩個字母與單元格條目的第一部分(0/0,0/11/1)和第三和第四列中的值相關。如果爲0,則使用第三列中的值(如果爲1),然後使用第四列中的值。

應用這些標準和操作,我想有這樣的事情結束了:

Chr1 29901 C T X X CC TC TT 
Chr1 A G GA GG X X AA 

任何人都可以提供如何(容易)去這樣做了一些建議(特別是使用AWK或Python )?

+1

添加了[標籤:慶典]標記,因爲我相信這是在bash殼。 –

+0

@jonrsharpe是的,我明白了,這就是我來這裏的原因。不幸的是,我不像你那樣有經驗。希望有人能夠提供更多幫助,因爲你顯然是忙於爲新手提供諷刺性的迴應,以提供建設性的建議。 – user2903950

+0

我正在學習,想學習,但還沒有遇到過這樣的例子。我對Python手冊非常熟悉,只是沒有時間自學一切。你知道一個可能有用的具體例子嗎? – user2903950

回答

2

這是awk的好工作。

awk ' 
{ 
    for (i = 5; i <= NF; ++i) { 
    split($i, a, ":"); 
    $i = (a[3] < 20 || a[4] < 30) ? "X" : $(3+substr(a[1],1,1)) $(3+substr(a[1],3,1)); 
    } 
} 
1 
' file 

說明

{ 
    # Loop through field numbers from 5 to the number of fields 
    for (i = 5; i <= NF; ++i) { 

    # Split field number i on ":" into array a 
    split($i, a, ":"); 

     # If a[3] < 20 or a[4] < 30 then 
    $i = (a[3] < 20 || a[4] < 30) ? 

     # Set field i to "X" 
     "X" : 

     # Otherwise set it to the value of 
     # field number (3 + int value of first char of a[1]) 
     # concatenated with the value of 
     # field number (3 + int value of third char of a[1]) 
     $(3+substr(a[1],1,1)) $(3+substr(a[1],3,1)); 
    } 
} 

# The following condition is true, so execute default action, printing the record 
1 
+3

+1:通過使用'1'成語進行迭代和打印行,只需重新構造字段即可避免使用'printf' ......雖然很好的邏輯。 –

+0

謝謝你ooga。我正在通過一本關於awk的書,現在還沒有完成。我會試試這個。 – user2903950

+0

ooga - 這幾乎可以工作,但是在我到達的細胞中......而在其他人中,我得到了類似於.C的東西,我試圖用它來解決問題。你有什麼想法? – user2903950