Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 基于列中的内部值筛选文件_Unix - Fatal编程技术网

Unix 基于列中的内部值筛选文件

Unix 基于列中的内部值筛选文件,unix,Unix,在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.0

在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;

我在这里用“|”来分隔我的三列

这里有一个简单的解决方案

$ 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=之前的所有内容,以及尾部
之后的所有内容char,只保留DP的值。测试该值,如果为真,则打印整行(awk
print
的默认操作是打印整行,但您可以告诉它打印您喜欢的任何内容,可能是
print”找到它:“$0
或大量变体

编辑

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;
我想保持前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
awk'FNR 53{
vpVal=$0;sub(/.*DP=/,“”,dpVal);sub(/;*$/,“”,dpVal)
如果(dpVal>7)打印
}'File.vcf>Output.txt
(我没有要测试的文件,因此如果这不正确,请告诉我)


IHTH

谢谢,它工作得很好-但我需要添加另一个级别:我当前使用的命令是:awk'FNR>53'File.vcf | awk'{dpVal=$0;sub(/.*DP=/,“”,dpVal);sub(/;*$/,“”,dpVal);if(dpVal>=6)print}“>Output.txt如您所见,我正在从第54行开始运行筛选器。我希望保持前53行的完整性,并将它们保存到我的Output.txt文件中。我可以使用一个命令行吗?我尝试了:awk'FNR 55{vpVal=$0;sub(/.*DP=/,“”,dpVal);sub(/;.$/,“”,dpVal);if(dpVal>=6)print}'threePatients.vcf>Output.txt然而,虽然没有错误消息-我只得到了第一部分工作,这意味着-我只得到了Output.txt文件中的55个头行,其余的命令似乎无法运行。我已经成功地用一个命令行解决了我的任务,如下所示:(head-n55 threePatients.vcf和&awk'FNR>55'threePatients.vcf | awk'{dpVal=$0;sub(/.*DP=/,“”,dpVal);sub(/;*$/,“”,dpVal);if(dpVal>=6)print})SimulalDp6VCFI非常感兴趣,但要了解你的建议是否可以进一步改进,所以它实际上会考虑这两个PASSM,而不仅仅是第一个,正如它目前所做的……如果你能,请再看一看,告诉我你是否有任何建议。如果你的命令,如果工作的话,看起来比我的更优雅。nks!(如果您愿意,我可以通过电子邮件将VCF文件发送给您!)