2017-08-24 69 views
0

我有一個這樣的文件:篩選幾列

[1]CHROM [2]POS [3]REF [4]ALT [5]GT_MA [6]GT_PA [7]GT_HI 
1 13380 C G 0/1 0/1 0/1 
1 13504 G A 0/0 0/0 0/0 
1 17361 T * ./. 0/0 0/0 
1 17365 C G ./. 0/0 0/0 
1 17373 A G 0/0 ./. 0/0 
1 17375 A G 0/1 0/1 1/1 
1 17378 C T 1/1 0/1 1/1 
1 17379 G A 0/0 ./. 0/0 
1 17385 G A 0/0 ./. 0/0 
1 17398 C A ./. ./. ./. 
1 17403 A G 0/0 ./. ./. 
1 17406 C T 0/0 ./. ./. 
1 17407 G A 0/0 ./. ./. 
1 17408 C G 0/0 ./. ./. 
1 17452 C T 0/0 0/0 0/0 
1 17478 C T 0/0 0/0 0/0 
1 17479 G A 0/0 0/0 0/0 
1 17483 C T 0/0 0/0 0/0 
1 17484 G A 0/1 1/1 1/1 
15 52640990 TAA TAAA,TAAAA,TA,T,TAAAAA 1/3 1/1 0/1 
15 72252189 TAAA TAAAA,TAA,T,TAAAAA,TA,TAAAAAA 0/0 0/1 1/2 

我想提取$ 5,$ 6及$ 7值的不同組合的所有行。例如$ 5 = 0/1,$ 6 = 0/1,$ 7 = 0/1; $ 5 = 0/1,$ 6 = 0/1,$ 7 = 1/1; $ 5 = 1/1,$ 6 = 0/1,$ 7 = 1/1和$ 5 = 1/1。

預期輸出:

[1]CHROM [2]POS [3]REF [4]ALT [5]GT_MA [6]GT_PA [7]GT_HI 
    1 13380 C G 0/1 0/1 0/1 
    1 17375 A G 0/1 0/1 1/1 
    1 17378 C T 1/1 0/1 1/1 
    1 17484 G A 0/1 1/1 1/1 

我試圖做這樣一個單獨的過濾沒有結果。

awk -F '\t' '{ if(($5 = 0/1) && ($6 =0/1) && ($7 = 0/1)) { print }}' file1 > file2out 

我不確定是否可以使用awk來做到這一點。謝謝你的幫助!

+0

您的樣本現在是否包含您已獲得2個答案失敗的行? –

回答

1

這AWK一個班輪可以幫助:

awk '{s=$5 FS $6 FS $7}s!~"[.]/[.]" && s~/[1-9]/ && !a[s]++' file 

輸出:

[1]CHROM [2]POS [3]REF [4]ALT [5]GT_MA [6]GT_PA [7]GT_HI 
1 13380 C G 0/1 0/1 0/1 
1 17375 A G 0/1 0/1 1/1 
1 17378 C T 1/1 0/1 1/1 
1 17484 G A 0/1 1/1 1/1 
+0

謝謝!它在這個例子中完美的工作,但我有同樣的問題,我在下面解釋給RavinderSingh13。 – Cris

+0

@Cris抱歉,我不明白你的真實數據有什麼問題。您應該編輯您的問題,而不是在某些評論中添加更多信息。另外,製作示例非常有用,但請嘗試使示例涵蓋所有真實場景。通過添加新的要求來打破答案總是一件容易的事。請編輯你的問題。 – Kent

0

能否請您嘗試以下,讓我知道,如果這可以幫助你。

awk 'NR==1{print;next} !a[$5,$6,$7]++ && $0 !~ /\.\/\./' Input_file 

編輯:能否請您嘗試以下一次。

awk 'NR==1{print;next} !a[$5,$6,$7]++ && $0 !~ /\.\/\./ && ($0 !~ /[2-9]\// || $0 !~ /\/[2-9]/)' Input_file 

EDIT1:比方說,我們有以下INPUT_FILE。

cat Input_file 
[1]CHROM [2]POS [3]REF [4]ALT [5]GT_MA [6]GT_PA [7]GT_HI 
1 13380 C G 0/1 0/1 0/1 
1 13504 G A 0/0 0/0 0/0 
1 17361 T * ./. 0/0 0/0 
1 17365 C G ./. 0/0 0/0 
1 17373 A G 0/0 ./. 0/0 
1 17375 A G 0/1 0/1 1/1 
1 17378 C T 1/1 0/1 1/1 
1 17379 G A 0/0 ./. 0/0 
1 17385 G A 0/0 ./. 0/0 
1 17398 C A ./. ./. ./. 
1 17403 A G 0/0 ./. ./. 
1 17406 C T 0/0 ./. ./. 
1 17407 G A 0/0 ./. ./. 
1 17408 C G 0/0 ./. ./. 
1 17452 C T 0/0 0/0 0/0 
1 17478 C T 0/0 0/0 0/0 
1 17479 G A 0/0 0/0 0/0 
1 17483 C T 0/0 0/0 0/0 
1 17484 G A 0/1 1/1 1/1 
1 17408 C G 0/0 ./. ./. 
1 17452 C T 0/0 0/0 0/0 
1 17478 C T 0/0 0/0 0/0 
1 17479 G A 0/0 0/0 0/0 
1 17483 C T 2/0 0/3 0/1 
1 17484 G A 2/3 1/2 1/3 

當我在EDIT中運行代碼時,它給了我下面的結果。

awk 'NR==1{print;next} !a[$5,$6,$7]++ && $0 !~ /\.\/\./ && ($0 !~ /[2-9]\// || $0 !~ /\/[2-9]/)' Input_file 
[1]CHROM [2]POS [3]REF [4]ALT [5]GT_MA [6]GT_PA [7]GT_HI 
1 13380 C G 0/1 0/1 0/1 
1 13504 G A 0/0 0/0 0/0 
1 17375 A G 0/1 0/1 1/1 
1 17378 C T 1/1 0/1 1/1 
1 17484 G A 0/1 1/1 1/1 
+0

謝謝!它在這個例子中完美地工作。我的錯誤不是說之前有6998919行的原始文件也包含像2/2和3/0這樣的值。如果我執行你的命令,我會得到像0/1 2/2 2/2這樣的值的行,而我只想要那些我之前解釋過的行。另一件事,你介意給我解釋一下你的命令,這樣我就可以知道它在做什麼。我是新的awk! – Cris

+0

@Cris,請你現在檢查我的編輯,讓我知道這是否有助於你。 – RavinderSingh13

+0

它仍然無法正常工作。也許我可以做第二個命令來消除不需要的行? – Cris