bash - 自动 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
解决方案
例如数据:
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 以预期格式打印键和值
推荐阅读
- wordpress - 多种帖子类型的 WPGraphQL 查询片段
- kubernetes - Istio 普罗米修斯联盟
- tensorflow - 我无法在 Anaconda 上使用 tensorflow
- laravel - Laravel Eloquent 降序
- c++ - 对 std::vector 使用嵌套 [ ] 操作
- google-apps-script - Google App Script UrlFetchApp.fetch 抛出地址不可用错误
- amazon-dynamodb - 如何根据另一个属性的条件更新 dynamodb 属性
- python-3.x - 如何使用 python 的 docxtpl 正确创建超链接?
- c++ - 函数覆盖有哪些用例?
- apache-spark - 写入 hdfs 路径时出现错误 java.io.IOException: 无法重命名