根据列中的内部值过滤文件

时间:2014-09-12 21:00:19

标签: unix

在UNIX中,我想根据" DP"过滤我的3列文件。第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;

我在这里使用" |"用于分隔我的三列

1 个答案:

答案 0 :(得分: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的值。测试该值,如果为true则打印整行(awk print的默认操作是打印整行,但您可以告诉它打印任何您喜欢的内容,可能是print "Found it:" $0或zillons变种。

修改

  

我想保留所有前53行,并将它们保存到我的Output.txt文件中。

是的,很容易,你走在正确的轨道上。使用awk很容易有多个条件处理文件中的不同部分或条件。试试这个:

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

(我没有要测试的文件,所以如果这不对,请告诉我。)

IHTH