2017-08-24 55 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