Awk 同时筛选多个列并提取行

Awk 同时筛选多个列并提取行,awk,filter,Awk,Filter,我有这样一个文件: [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

我有这样一个文件:

[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=0/1,$6=1/1,$7=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来做这件事。谢谢你的帮助

此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

请您尝试以下内容,并让我知道这是否有助于您

 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:假设我们有以下输入文件

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

非常感谢。它在这个例子中非常有效。我的错误并不是说原来的文件有6998919行,也包含2/2、3/0之类的值。如果我执行您的命令,我将获得值为0/12/2/2的行,并且我只想要我之前解释过的那些行。还有一件事,你介意向我解释一下你的命令吗?这样我就可以知道它在做什么。我是awk的新手@克里斯,请你现在检查我的编辑,让我知道这是否对你有帮助。它仍然不起作用。也许我可以执行第二个命令来消除不需要的行?@Cris,我想请您编辑示例数据,我用自己的值编辑了输入文件(根据您的解释),它成功了。如果没有帮助,请将信息添加到您的帖子中。谢谢!它在示例中非常有效,但我遇到了下面我向RavinderSingh13解释的相同问题。@Cris抱歉,我无法理解您的真实数据有什么问题。你应该编辑你的问题,而不是在一些评论中添加更多信息。此外,举例是非常有帮助的,但请尽量让例子涵盖你所有的真实场景。通过添加新的需求来打破答案总是一件容易的事情。请编辑您的问题。您的示例现在是否包含已获得的两个答案的失败行?