2014-09-12 102 views
1

在UNIX中,我想根據第3列中的「DP」值過濾我的3列文件。 我想僅獲得具有DP值高於7基於列內部值過濾文件

A|49.14|AC=2;AF=0.500;AN=4;BaseQRankSum=1.380;DP=6;Dels=0.00; 
T|290.92|AC=2;AF=1.00;AN=2;DP=8;Dels=0.00;FS=0.000;HaplotypeScore=0.0000; 
T|294.75|AC=6;AF=1.00;AN=6;DP=9;Dels=0.00;FS=0.000;HaplotypeScore=0.0000;MLEAC=6; 

我在這裏使用行「|」我的三列之間的分離

回答

0

這裏有一個簡單的解決方案

$ echo "A|49.14|AC=2;AF=0.500;AN=4;BaseQRankSum=1.380;DP=6;Dels=0.00; 
AC=6;AF=1.00;AN=6;DP=9;Dels=0.00;FS=0.000;HaplotypeScore=0.0000;MLEAC=6;T|290.92|AC=2;AF=1.00;AN=2;DP=8;Dels=0.00;FS=0.000;HaplotypeScore=0.0000; 
MLEAC=6;" \ 
| awk '{dpVal=$0;sub(/.*DP=/, "", dpVal);sub(/;.*$/,"", dpVal); if (dpVal>7) print}' 

輸出

T|290.92|AC=2;AF=1.00;AN=2;DP=8;Dels=0.00;FS=0.000;HaplotypeScore=0.0000; 
T|294.75|AC=6;AF=1.00;AN=6;DP=9;Dels=0.00;FS=0.000;HaplotypeScore=0.0000;MLEAC=6; 

這使得每行($ 0)的複印件,除掉一切DP=面前,尾隨;該字段的字符後的所有內容,只留下DP的值。該值進行測試,如果真打印整條生產線(AWK print的默認操作是打印整條生產線,但你可以告訴它來打印你喜歡的東西,也許變種print "Found it:" $0或zillons。

編輯

我想保持所有的第一線53和完整,以及將它們保存到我的Output.txt的文件。

是的,很容易,你是在正確的軌道上。用awk是很容易有多個條件的過程d文件中的不同部分或條件。試試這個:

awk 'FNR <= 53 {print} 
    FNR > 53 { 
     vpVal=$0;sub(/.*DP=/, "", dpVal);sub(/;.*$/,"", dpVal) 
     if (dpVal>7) print 
    }' File.vcf > Output.txt 

(我沒有一個文件來測試,所以讓我知道如果這是不正確的)。

IHTH

+0

謝謝,它的偉大工程 - 但我需要給它添加另一個層面:我目前使用的命令是:AWK 'FNR> 53' File.vcf | awk的「{dpVal = $ 0 ; sub(/.* DP = /,「」,dpVal); sub(/;.*$/,「」,dpVal); if(dpVal> = 6)print}'> Output.txt正如你所看到的,我從第54行開始運行過濾器。我想保留所有前53行完好並保存到我的Output.txt文件中。我可以使用一個命令班輪嗎? – Roy 2014-09-15 15:41:57

+0

@羅伊,看我的編輯,有幫助嗎?祝你好運。 – shellter 2014-09-16 16:07:02

+0

我試過了:awk'FNR <= 55 {print}; FNR> 55 {vpVal = $ 0; sub(/.* DP = /,「」,dpVal); sub(/;.$$/,「」,dpVal); if(dpVal> = 6)print}'threePatients.vcf> Output.txt但是,雖然沒有錯誤消息 - 我只得到第一部分的工作,這意味着 - 我只是在Output.txt文件中獲得了55個標題行,該命令的其餘部分似乎不起作用。 (頭像-n 55 threePatients.vcf && awk'FNR> 55'threePatients.vcf | awk'{dpVal = $ 0; sub(/.* DP = /, 「」,dpVal); sub(/;.*$/,「」,dpVal); if(dpVal> = 6)print}')> threePatients.MinimalDP6.vcf – Roy 2014-09-17 14:50:00