首页 > 解决方案 > 自动 awk 命令删除 VCF 的 INFO 列中的重复字段,保持第一次出现

问题描述

我的 VCF 文件中存在重复字段会导致其他程序出现问题。VCF 文件是制表符分隔的文件。下面给出了 INFO 列的一个单元格。细胞的结构是:

info1=x;info2=y;.....;info1=.;info2=.;.....

我需要一个脚本来删除第一次出现后重复的重复字段并将单元格替换为:

info1=x;info2=y;.....

实际细胞...

.;ANNOVAR_DATE=2017-07-17;Func.refGene=exonic;Gene.refGene=GRIK3;GeneDetail.refGene=.;ExonicFunc.refGene=nonsynonymous_SNV;AAChange.refGene=GRIK3:NM_000831:exon10:c.C1348T:p.R450W;avsnp150=.;cosmic70=ID\x3dCOSM186835\x3bOCCURENCE\x3d2(large_intestine),1(lung),1(haematopoietic_and_lymphoid_tissue);ExAC_ALL=.;ExAC_AFR=.;ExAC_AMR=.;ExAC_EAS=.;ExAC_FIN=.;ExAC_NFE=.;ExAC_OTH=.;ExAC_SAS=.;SIFT_score=0.001;SIFT_pred=D;Polyphen2_HDIV_score=1.0;Polyphen2_HDIV_pred=D;Polyphen2_HVAR_score=0.916;Polyphen2_HVAR_pred=D;LRT_score=0.000;LRT_pred=D;MutationTaster_score=0.983;MutationTaster_pred=D;MutationAssessor_score=2.485;MutationAssessor_pred=M;FATHMM_score=2.73;FATHMM_pred=T;PROVEAN_score=-4.81;PROVEAN_pred=D;VEST3_score=0.558;CADD_raw=6.549;CADD_phred=31;DANN_score=0.999;fathmm-MKL_coding_score=0.906;fathmm-MKL_coding_pred=D;MetaSVM_score=-0.981;MetaSVM_pred=T;MetaLR_score=0.095;MetaLR_pred=T;integrated_fitCons_score=0.653;integrated_confidence_value=0;GERP++_RS=4.03;phyloP7way_vertebrate=0.917;phyloP20way_mammalian=0.953;phastCons7way_vertebrate=0.997;phastCons20way_mammalian=0.991;SiPhy_29way_logOdds=12.627;ALLELE_END;ANNOVAR_DATE=2017-07-17;Func.refGene=exonic;Gene.refGene=GRIK3;GeneDetail.refGene=.;ExonicFunc.refGene=.;AAChange.refGene=.;avsnp150=.;cosmic70=.;ExAC_ALL=.;ExAC_AFR=.;ExAC_AMR=.;ExAC_EAS=.;ExAC_FIN=.;ExAC_NFE=.;ExAC_OTH=.;ExAC_SAS=.;SIFT_score=.;SIFT_pred=.;Polyphen2_HDIV_score=.;Polyphen2_HDIV_pred=.;Polyphen2_HVAR_score=.;Polyphen2_HVAR_pred=.;LRT_score=.;LRT_pred=.;MutationTaster_score=.;MutationTaster_pred=.;MutationAssessor_score=.;MutationAssessor_pred=.;FATHMM_score=.;FATHMM_pred=.;PROVEAN_score=.;PROVEAN_pred=.;VEST3_score=.;CADD_raw=.;CADD_phred=.;DANN_score=.;fathmm-MKL_coding_score=.;fathmm-MKL_coding_pred=.;MetaSVM_score=.;MetaSVM_pred=.;MetaLR_score=.;MetaLR_pred=.;integrated_fitCons_score=.;integrated_confidence_value=.;GERP++_RS=.;phyloP7way_vertebrate=.;phyloP20way_mammalian=.;phastCons7way_vertebrate=.;phastCons20way_mammalian=.;SiPhy_29way_logOdds=.;ALLELE_END

标签: bashawkvcf-variant-call-format

解决方案


例如数据:

info1=x;info2=y;xyz=abc;info1=othervalue;info2=.

假设您要保留名称的第一个实例!

echo "info1=x;info2=y;xyz=abc;info1=othervalue;info2=." |sed -e 's/;/\n/g' |awk -F= '{ if ($1 in words == 0) words[$1]=$2} END { for (w in words) printf"%s=%s;", w, words[w]}'

结果:

info1=x;info2=y;xyz=abc;

与您一起适应您的数据。
我使用了 gawk v 4.0.2

解释:
1. sed 在分号出现的地方将字符串分成行,
2. -e 选项表示可以使用转义字符
3. -F = 指示 AWK 在 = 处将行分成单词
4. { if ($ 1 in words == 0) words [$ 1] = $ 2} 对于每一行,检查单词 1 是否在单词数组中,如果没有,则将单词数组的元素添加到单词 word1 中,其值为word 2
5. END {...} 在最后完成,读取数组 words 的所有元素,然后 printf 以预期格式打印键和值


推荐阅读