<p>The simplest alternative is to have a directory with all the vcf files you want to merge, and use bcftools merge. Example:</p>
<pre><code>vcf_dir=path_to_your_vcf_directory
bcftools merge $vcf_dir/*.vcf -o bcftools_merged.vcf
</code></pre>

CC BY-SA 4.0
2024-03-07T19:48:30.750Z
This does not answer the question. It's literally the second step from terdon's answer, so I don't see why this deserves to be its own answer.
Ram RS
CC BY-SA 4.0
2024-03-07T22:16:36.490Z
Just to point out @RamRS does have a valid complaint.
M__
CC BY-SA 4.0
2024-03-07T19:30:27.497Z
2024-03-07T19:30:27.497Z
Felipe Batalini
<p>The first step is to merge your VCFs. For this, you need to compress them with <code>bgzip</code> and then index with <code>tabix</code>:</p>
<pre><code>for file in *vcf; do
  bgzip &quot;$file&quot;
  tabix &quot;$file&quot;.gz
done
</code></pre>
<p>Now, feed the files to <code>bcftools merge</code>. In this example, I have saved your two files as <code>sample1.vcf.gz</code> and <code>sample2.vcf.gz</code>, and they're the only vcf files in the directory, so I can catch them all with <code>*vcf.gz</code>:</p>
<pre><code>bcftools merge *.vcf.gz &gt; merged.vcf
</code></pre>
<p>This results in a file containing a single variant line, with an entry for each of the two samples:</p>
<pre><code>chr20   4699818 .   G   A   .   .   AS_SB_TABLE=1376,1402|0,0;ECNT=1;DP=2987;MBQ=11,0;MFRL=243,0;MMQ=60,60;MPOS=50;POPAF=7.3;TLOD=-1.584    GT:AD:AF:DP:F1R2:F2R1:FAD:SB    0/1:2778,0:0.00041:2778:472,0:398,0:2493,0:1376,1402,0,0    0/1:34,0:0.026:34:0,0:0,0:33,0:22,12,0,0
</code></pre>
<p>From this, <code>bcftools query</code> can give you <em>almost</em> exactly what you need. The main problem is that when merging, the INFO fields are not combined. Only one is kept. In my test, it was the one from the last file processed, but this could be random, I don't know. This is the closest I could get to your desired format:</p>
<pre><code>$ { printf 'Sample\tCHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tGT\tFORMAT-DP\tAD\n'; 
  bcftools query --format &quot;[%SAMPLE ]\t%CHROM\t%POS0\t%ID\t%REF\t%ALT\t%QUAL\t%FILTER\t[%GT ]\t[%DP ]\t[%AD ] &quot; merged.vcf ; } | column -s$'\t' -t
Sample                                                                          CHROM  POS      ID  REF  ALT  QUAL  FILTER  GT          FORMAT-DP  AD
312091_8-Ctrl5_H02_S3_R1_001.fastq.gz 312092_15-Ctrl4_H01_S11_R1_001.fastq.gz   chr20  4699817  .   G    A    .     .        0/1  0/1   2778 34    2778,0 34,0  
</code></pre>
<p>The main command is this:</p>
<pre><code>bcftools query --format &quot;[%SAMPLE ]\t%CHROM\t%POS0\t%ID\t%REF\t%ALT\t%QUAL\t%FILTER\t[%GT ]\t[%DP ]\t[%AD ] &quot; merged.vcf
</code></pre>
<p>The rest just add a header and pretty formatting for clarity. Please see <a href="https://samtools.github.io/bcftools/bcftools.html#query" rel="nofollow noreferrer">https://samtools.github.io/bcftools/bcftools.html#query</a> for details on the options used.</p>
<p>This is close, but not quite. You have the sample names listed on the same line, we're missing the DP value from the FORMAT field and we have the ADs shown in pairs, not in different columns as requested. A little post-processing can fix everything except the missing DP/FORMAT:</p>
<pre><code><span class="math-container">$ { 
  printf 'Sample\tCHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tGT\tFORMAT-DP\tAD-REF\tAD-ALT\n'; 
  bcftools query --format "[%SAMPLE ]\t%CHROM\t%POS0\t%ID\t%REF\t%ALT\t%QUAL\t%FILTER\t[%GT ]\t[%DP ]\t[%AD ] " merged.vcf | 
   awk -F'\t' -v OFS="\t" '
  { 
    split($1, samples, " "); 
    split($9, genotypes, " "); 
    split($10, dps, " ");
    split($11, ads, " "); 
    for(s in samples){ 
       split(ads[s], sampleAd, ",");  
       print samples[s], $2, $3, $4, $5, $6, $7, $8, genotypes[s], dps[s], sampleAd[1], sampleAd[2]
     }
  }'; 
} | column -s$</span>'\t' -t
Sample                                   CHROM  POS      ID       REF  ALT  QUAL  FILTER  GT   FORMAT-DP  AD-REF  AD-ALT
312091_8-Ctrl5_H02_S3_R1_001.fastq.gz    chr20  4699817  .  G    A    .     .       0/1  2778       2778    0
312092_15-Ctrl4_H01_S11_R1_001.fastq.gz  chr20  4699817 .  G    A    .     .       0/1  34         34      0

</code></pre>
<p><strong>Important</strong>: the command above assumes there are no spaces in your sample names nor in any of the values returned. It also assumes only one ALT allele per variant. Please update your question if these assumptions are not valid.</p>
<p>This is as close as I can get it using &quot;standard&quot; tools and relatively little post-processing. It is everything you asked for except the INFO DP. If you absolutely must have that too (which seems a bit odd, honestly, you usually want the one actually reported for the variant), I fear that will require just parsing the whole thing manually.</p>

CC BY-SA 4.0
2024-03-06T11:05:26.730Z
this is exactly what I needed, thank you so much!
Nereus
CC BY-SA 4.0
2024-03-05T18:41:26.467Z
2024-03-06T14:01:34.420Z
2024-03-06T14:01:34.420Z
terdon
<p>I have got a number of VCF files that all contain data on one particular variant, with every VCF being created from an individual sample. So there is one entry per file (headers omitted):</p>
<pre><code>##source=Mutect2
##tumor_sample=312091_5-Ctrl1_G01_S6_R1_001.fastq.gz
#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  312091_5-Ctrl1_G01_S6_R1_001.fastq.gz
chr20   4699818 .   G   A   .   .   AS_SB_TABLE=805,864|0,0;DP=1871;ECNT=1;MBQ=17,0;MFRL=273,0;MMQ=60,60;MPOS=50;POPAF=7.30;TLOD=-3.537e+00 GT:AD:AF:DP:F1R2:F2R1:FAD:SB    0/1:1669,0:6.794e-04:1669:252,0:233,0:1595,0:805,864,0,0
</code></pre>
<p>I would like to create a summary table of the parameters given within the VCFs, including of the parameters within the <code>FORMAT</code> field. Ideally this table would have the following as header:</p>
<pre><code>Sample CHROM    POS ID  REF ALT QUAL    FILTER  GT INFO-DP FORMAT-DP AD-REF AD-ALT
</code></pre>
<p>and every sample/variant combination would be a line. I would like to use such a table to create statistics for my samples (on zygosity, number of ALT variants etc).</p>
<p>Is there a pre-made tool that is capable of doing this? I'm also open to any other suggestions. Thanks!</p>
<p><strong>Edit</strong>:
Here are two VCF files (I have about 30 in total) and the desired output</p>
<p><strong>First VCF</strong>:</p>
<pre><code>##fileformat=VCFv4.2
##FORMAT=&lt;ID=AD,Number=R,Type=Integer,Description=&quot;Allelic depths for the ref and alt alleles in the order listed&quot;&gt;
##FORMAT=&lt;ID=AF,Number=A,Type=Float,Description=&quot;Allele fractions of alternate alleles in the tumor&quot;&gt;
##FORMAT=&lt;ID=DP,Number=1,Type=Integer,Description=&quot;Approximate read depth (reads with MQ=255 or with bad mates are filtered)&quot;&gt;
##FORMAT=&lt;ID=F1R2,Number=R,Type=Integer,Description=&quot;Count of reads in F1R2 pair orientation supporting each allele&quot;&gt;
##FORMAT=&lt;ID=F2R1,Number=R,Type=Integer,Description=&quot;Count of reads in F2R1 pair orientation supporting each allele&quot;&gt;
##FORMAT=&lt;ID=FAD,Number=R,Type=Integer,Description=&quot;Count of fragments supporting each allele.&quot;&gt;
##FORMAT=&lt;ID=GQ,Number=1,Type=Integer,Description=&quot;Genotype Quality&quot;&gt;
##FORMAT=&lt;ID=GT,Number=1,Type=String,Description=&quot;Genotype&quot;&gt;
##FORMAT=&lt;ID=PGT,Number=1,Type=String,Description=&quot;Physical phasing haplotype information, describing how the alternate alleles are phased in relation to one another; will always be heterozygous and is not intended to describe called alleles&quot;&gt;
##FORMAT=&lt;ID=PID,Number=1,Type=String,Description=&quot;Physical phasing ID information, where each unique ID within a given sample (but not across samples) connects records within a phasing group&quot;&gt;
##FORMAT=&lt;ID=PL,Number=G,Type=Integer,Description=&quot;Normalized, Phred-scaled likelihoods for genotypes as defined in the VCF specification&quot;&gt;
##FORMAT=&lt;ID=PS,Number=1,Type=Integer,Description=&quot;Phasing set (typically the position of the first variant in the set)&quot;&gt;
##FORMAT=&lt;ID=SB,Number=4,Type=Integer,Description=&quot;Per-sample component statistics which comprise the Fisher's Exact Test to detect strand bias.&quot;&gt;
##GATKCommandLine=&lt;ID=Mutect2,CommandLine=&quot;Mutect2 --alleles /add/2024-03-04_force_mutect/E200K.vcf.gz --output /add/2024-03-04_force_mutect/output//Ctrl5_E200K_frequency.vcf --intervals /add/2024-03-04_force_mutect/E200K.vcf.gz --input /add/2023-06-18_CJD_8_samples/312091_8-Ctrl5_H02_S3_R1_001.fastq.gz.picard.markedDup.recal.bam --reference /home/mcarta/databases/hg38.fa --f1r2-median-mq 50 --f1r2-min-bq 20 --f1r2-max-depth 200 --flow-likelihood-parallel-threads 0 --flow-likelihood-optimized-comp false --trim-to-haplotype true --exact-matching false --flow-use-t0-tag false --flow-probability-threshold 0.003 --flow-remove-non-single-base-pair-indels false --flow-remove-one-zero-probs false --flow-quantization-bins 121 --flow-fill-empty-bins-value 0.001 --flow-symmetric-indel-probs false --flow-report-insertion-or-deletion false --flow-disallow-probs-larger-than-call false --flow-lump-probs false --flow-retain-max-n-probs-base-format false --flow-probability-scaling-factor 10 --flow-order-cycle-length 4 --keep-boundary-flows false --genotype-pon-sites false --genotype-germline-sites false --af-of-alleles-not-in-resource -1.0 --mitochondria-mode false --mutect3-training-mode false --mutect3-ref-downsample 10 --mutect3-alt-downsample 20 --mutect3-non-artifact-ratio 20 --tumor-lod-to-emit 3.0 --initial-tumor-lod 2.0 --pcr-snv-qual 40 --pcr-indel-qual 40 --base-qual-correction-factor 5 --max-population-af 0.01 --downsampling-stride 1 --callable-depth 10 --max-suspicious-reads-per-alignment-start 0 --normal-lod 2.2 --ignore-itr-artifacts false --gvcf-lod-band -2.5 --gvcf-lod-band -2.0 --gvcf-lod-band -1.5 --gvcf-lod-band -1.0 --gvcf-lod-band -0.5 --gvcf-lod-band 0.0 --gvcf-lod-band 0.5 --gvcf-lod-band 1.0 --minimum-allele-fraction 0.0 --independent-mates false --flow-mode NONE --disable-adaptive-pruning false --kmer-size 10 --kmer-size 25 --dont-increase-kmer-sizes-for-cycles false --allow-non-unique-kmers-in-ref false --num-pruning-samples 1 --min-dangling-branch-length 4 --recover-all-dangling-branches false --max-num-haplotypes-in-population 128 --min-pruning 2 --adaptive-pruning-initial-error-rate 0.001 --pruning-lod-threshold 2.302585092994046 --pruning-seeding-lod-threshold 9.210340371976184 --max-unpruned-variants 100 --linked-de-bruijn-graph false --disable-artificial-haplotype-recovery false --enable-legacy-graph-cycle-detection false --debug-assembly false --debug-graph-transformations false --capture-assembly-failure-bam false --num-matching-bases-in-dangling-end-to-recover -1 --error-correction-log-odds -Infinity --error-correct-reads false --kmer-length-for-read-error-correction 25 --min-observations-for-kmer-to-be-solid 20 --likelihood-calculation-engine PairHMM --base-quality-score-threshold 18 --dragstr-het-hom-ratio 2 --dont-use-dragstr-pair-hmm-scores false --pair-hmm-gap-continuation-penalty 10 --expected-mismatch-rate-for-read-disqualification 0.02 --pair-hmm-implementation FASTEST_AVAILABLE --pcr-indel-model CONSERVATIVE --phred-scaled-global-read-mismapping-rate 45 --disable-symmetric-hmm-normalizing false --disable-cap-base-qualities-to-map-quality false --enable-dynamic-read-disqualification-for-genotyping false --dynamic-read-disqualification-threshold 1.0 --native-pair-hmm-threads 4 --native-pair-hmm-use-double-precision false --flow-hmm-engine-min-indel-adjust 6 --flow-hmm-engine-flat-insertion-penatly 45 --flow-hmm-engine-flat-deletion-penatly 45 --pileup-detection false --use-pdhmm false --use-pdhmm-overlap-optimization false --make-determined-haps-from-pd-code false --print-pileupcalling-status false --fallback-gga-if-pdhmm-fails true --pileup-detection-enable-indel-pileup-calling false --pileup-detection-active-region-phred-threshold 0.0 --num-artificial-haplotypes-to-add-per-allele 5 --artifical-haplotype-filtering-kmer-size 10 --pileup-detection-snp-alt-threshold 0.1 --pileup-detection-indel-alt-threshold 0.1 --pileup-detection-absolute-alt-depth 0.0 --pileup-detection-snp-adjacent-to-assembled-indel-range 5 --pileup-detection-snp-basequality-filter 12 --pileup-detection-bad-read-tolerance 0.0 --pileup-detection-proper-pair-read-badness true --pileup-detection-edit-distance-read-badness-threshold 0.08 --pileup-detection-chimeric-read-badness true --pileup-detection-template-mean-badness-threshold 0.0 --pileup-detection-template-std-badness-threshold 0.0 --pileup-detection-filter-assembly-alt-bad-read-tolerance 0.0 --pileup-detection-edit-distance-read-badness-for-assembly-filtering-threshold 0.12 --bam-writer-type CALLED_HAPLOTYPES --dont-use-soft-clipped-bases false --override-fragment-softclip-check false --min-base-quality-score 10 --smith-waterman FASTEST_AVAILABLE --emit-ref-confidence NONE --max-mnp-distance 1 --force-call-filtered-alleles false --reference-model-deletion-quality 30 --soft-clip-low-quality-ends false --allele-informative-reads-overlap-margin 2 --smith-waterman-dangling-end-match-value 25 --smith-waterman-dangling-end-mismatch-penalty -50 --smith-waterman-dangling-end-gap-open-penalty -110 --smith-waterman-dangling-end-gap-extend-penalty -6 --smith-waterman-haplotype-to-reference-match-value 200 --smith-waterman-haplotype-to-reference-mismatch-penalty -150 --smith-waterman-haplotype-to-reference-gap-open-penalty -260 --smith-waterman-haplotype-to-reference-gap-extend-penalty -11 --smith-waterman-read-to-haplotype-match-value 10 --smith-waterman-read-to-haplotype-mismatch-penalty -15 --smith-waterman-read-to-haplotype-gap-open-penalty -30 --smith-waterman-read-to-haplotype-gap-extend-penalty -5 --flow-assembly-collapse-hmer-size 0 --flow-assembly-collapse-partial-mode false --flow-filter-alleles false --flow-filter-alleles-qual-threshold 30.0 --flow-filter-alleles-sor-threshold 3.0 --flow-filter-lone-alleles false --flow-filter-alleles-debug-graphs false --min-assembly-region-size 50 --max-assembly-region-size 300 --active-probability-threshold 0.002 --max-prob-propagation-distance 50 --force-active false --assembly-region-padding 100 --padding-around-indels 75 --padding-around-snps 20 --padding-around-strs 75 --max-extension-into-assembly-region-padding-legacy 25 --max-reads-per-alignment-start 50 --enable-legacy-assembly-region-trimming false --interval-set-rule UNION --interval-padding 0 --interval-exclusion-padding 0 --interval-merging-rule ALL --read-validation-stringency SILENT --seconds-between-progress-updates 10.0 --disable-sequence-dictionary-validation false --create-output-bam-index true --create-output-bam-md5 false --create-output-variant-index true --create-output-variant-md5 false --max-variants-per-shard 0 --lenient false --add-output-sam-program-record true --add-output-vcf-command-line true --cloud-prefetch-buffer 40 --cloud-index-prefetch-buffer -1 --disable-bam-index-caching false --sites-only-vcf-output false --help false --version false --showHidden false --verbosity INFO --QUIET false --use-jdk-deflater false --use-jdk-inflater false --gcs-max-retries 20 --gcs-project-for-requester-pays  --disable-tool-default-read-filters false --max-read-length 2147483647 --min-read-length 30 --minimum-mapping-quality 20 --disable-tool-default-annotations false --enable-all-annotations false&quot;,Version=&quot;4.5.0.0&quot;,Date=&quot;March 5, 2024 at 10:20:03 AM UTC&quot;&gt;
##INFO=&lt;ID=AS_SB_TABLE,Number=1,Type=String,Description=&quot;Allele-specific forward/reverse read counts for strand bias tests. Includes the reference and alleles separated by |.&quot;&gt;
##INFO=&lt;ID=AS_UNIQ_ALT_READ_COUNT,Number=A,Type=Integer,Description=&quot;Number of reads with unique start and mate end positions for each alt at a variant site&quot;&gt;
##INFO=&lt;ID=CONTQ,Number=1,Type=Float,Description=&quot;Phred-scaled qualities that alt allele are not due to contamination&quot;&gt;
##INFO=&lt;ID=DP,Number=1,Type=Integer,Description=&quot;Approximate read depth; some reads may have been filtered&quot;&gt;
##INFO=&lt;ID=ECNT,Number=1,Type=Integer,Description=&quot;Number of events in this haplotype&quot;&gt;
##INFO=&lt;ID=GERMQ,Number=1,Type=Integer,Description=&quot;Phred-scaled quality that alt alleles are not germline variants&quot;&gt;
##INFO=&lt;ID=MBQ,Number=R,Type=Integer,Description=&quot;median base quality by allele&quot;&gt;
##INFO=&lt;ID=MFRL,Number=R,Type=Integer,Description=&quot;median fragment length by allele&quot;&gt;
##INFO=&lt;ID=MMQ,Number=R,Type=Integer,Description=&quot;median mapping quality by allele&quot;&gt;
##INFO=&lt;ID=MPOS,Number=A,Type=Integer,Description=&quot;median distance from end of read&quot;&gt;
##INFO=&lt;ID=NALOD,Number=A,Type=Float,Description=&quot;Negative log 10 odds of artifact in normal with same allele fraction as tumor&quot;&gt;
##INFO=&lt;ID=NCount,Number=1,Type=Integer,Description=&quot;Count of N bases in the pileup&quot;&gt;
##INFO=&lt;ID=NLOD,Number=A,Type=Float,Description=&quot;Normal log 10 likelihood ratio of diploid het or hom alt genotypes&quot;&gt;
##INFO=&lt;ID=OCM,Number=1,Type=Integer,Description=&quot;Number of alt reads whose original alignment doesn't match the current contig.&quot;&gt;
##INFO=&lt;ID=PON,Number=0,Type=Flag,Description=&quot;site found in panel of normals&quot;&gt;
##INFO=&lt;ID=POPAF,Number=A,Type=Float,Description=&quot;negative log 10 population allele frequencies of alt alleles&quot;&gt;
##INFO=&lt;ID=ROQ,Number=1,Type=Float,Description=&quot;Phred-scaled qualities that alt allele are not due to read orientation artifact&quot;&gt;
##INFO=&lt;ID=RPA,Number=R,Type=Integer,Description=&quot;Number of times tandem repeat unit is repeated, for each allele (including reference)&quot;&gt;
##INFO=&lt;ID=RU,Number=1,Type=String,Description=&quot;Tandem repeat unit (bases)&quot;&gt;
##INFO=&lt;ID=SEQQ,Number=1,Type=Integer,Description=&quot;Phred-scaled quality that alt alleles are not sequencing errors&quot;&gt;
##INFO=&lt;ID=STR,Number=0,Type=Flag,Description=&quot;Variant is a short tandem repeat&quot;&gt;
##INFO=&lt;ID=STRANDQ,Number=1,Type=Integer,Description=&quot;Phred-scaled quality of strand bias artifact&quot;&gt;
##INFO=&lt;ID=STRQ,Number=1,Type=Integer,Description=&quot;Phred-scaled quality that alt alleles in STRs are not polymerase slippage errors&quot;&gt;
##INFO=&lt;ID=TLOD,Number=A,Type=Float,Description=&quot;Log 10 likelihood ratio score of variant existing versus not existing&quot;&gt;
##MutectVersion=2.2
##contig=&lt;ID=chr2,length=242193529&gt;
##contig=&lt;ID=chr20,length=64444167&gt;
##contig=&lt;ID=chr4,length=190214555&gt;
##filtering_status=Warning: unfiltered Mutect 2 calls.  Please run FilterMutectCalls to remove false positives.
##source=Mutect2
##tumor_sample=312091_8-Ctrl5_H02_S3_R1_001.fastq.gz
#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  312091_8-Ctrl5_H02_S3_R1_001.fastq.gz
chr20   4699818 .   G   A   .   .   AS_SB_TABLE=1376,1402|0,0;DP=2939;ECNT=1;MBQ=18,0;MFRL=257,0;MMQ=60,60;MPOS=50;POPAF=7.30;TLOD=-3.455e+00   GT:AD:AF:DP:F1R2:F2R1:FAD:SB    0/1:2778,0:4.100e-04:2778:472,0:398,0:2493,0:1376,1402,0,0
</code></pre>
<p><strong>Second VCF</strong>:</p>
<pre><code>##fileformat=VCFv4.2
##FORMAT=&lt;ID=AD,Number=R,Type=Integer,Description=&quot;Allelic depths for the ref and alt alleles in the order listed&quot;&gt;
##FORMAT=&lt;ID=AF,Number=A,Type=Float,Description=&quot;Allele fractions of alternate alleles in the tumor&quot;&gt;
##FORMAT=&lt;ID=DP,Number=1,Type=Integer,Description=&quot;Approximate read depth (reads with MQ=255 or with bad mates are filtered)&quot;&gt;
##FORMAT=&lt;ID=F1R2,Number=R,Type=Integer,Description=&quot;Count of reads in F1R2 pair orientation supporting each allele&quot;&gt;
##FORMAT=&lt;ID=F2R1,Number=R,Type=Integer,Description=&quot;Count of reads in F2R1 pair orientation supporting each allele&quot;&gt;
##FORMAT=&lt;ID=FAD,Number=R,Type=Integer,Description=&quot;Count of fragments supporting each allele.&quot;&gt;
##FORMAT=&lt;ID=GQ,Number=1,Type=Integer,Description=&quot;Genotype Quality&quot;&gt;
##FORMAT=&lt;ID=GT,Number=1,Type=String,Description=&quot;Genotype&quot;&gt;
##FORMAT=&lt;ID=PGT,Number=1,Type=String,Description=&quot;Physical phasing haplotype information, describing how the alternate alleles are phased in relation to one another; will always be heterozygous and is not intended to describe called alleles&quot;&gt;
##FORMAT=&lt;ID=PID,Number=1,Type=String,Description=&quot;Physical phasing ID information, where each unique ID within a given sample (but not across samples) connects records within a phasing group&quot;&gt;
##FORMAT=&lt;ID=PL,Number=G,Type=Integer,Description=&quot;Normalized, Phred-scaled likelihoods for genotypes as defined in the VCF specification&quot;&gt;
##FORMAT=&lt;ID=PS,Number=1,Type=Integer,Description=&quot;Phasing set (typically the position of the first variant in the set)&quot;&gt;
##FORMAT=&lt;ID=SB,Number=4,Type=Integer,Description=&quot;Per-sample component statistics which comprise the Fisher's Exact Test to detect strand bias.&quot;&gt;
##GATKCommandLine=&lt;ID=Mutect2,CommandLine=&quot;Mutect2 --alleles /add/2024-03-04_force_mutect/E200K.vcf.gz --output /add/2024-03-04_force_mutect/output//Ctrl4_E200K_frequency.vcf --intervals /add/2024-03-04_force_mutect/E200K.vcf.gz --input /add/2023-06-18_CJD_16_samples/312092_15-Ctrl4_H01_S11_R1_001.fastq.gz.picard.markedDup.recal.bam --reference /home/mcarta/databases/hg38.fa --f1r2-median-mq 50 --f1r2-min-bq 20 --f1r2-max-depth 200 --flow-likelihood-parallel-threads 0 --flow-likelihood-optimized-comp false --trim-to-haplotype true --exact-matching false --flow-use-t0-tag false --flow-probability-threshold 0.003 --flow-remove-non-single-base-pair-indels false --flow-remove-one-zero-probs false --flow-quantization-bins 121 --flow-fill-empty-bins-value 0.001 --flow-symmetric-indel-probs false --flow-report-insertion-or-deletion false --flow-disallow-probs-larger-than-call false --flow-lump-probs false --flow-retain-max-n-probs-base-format false --flow-probability-scaling-factor 10 --flow-order-cycle-length 4 --keep-boundary-flows false --genotype-pon-sites false --genotype-germline-sites false --af-of-alleles-not-in-resource -1.0 --mitochondria-mode false --mutect3-training-mode false --mutect3-ref-downsample 10 --mutect3-alt-downsample 20 --mutect3-non-artifact-ratio 20 --tumor-lod-to-emit 3.0 --initial-tumor-lod 2.0 --pcr-snv-qual 40 --pcr-indel-qual 40 --base-qual-correction-factor 5 --max-population-af 0.01 --downsampling-stride 1 --callable-depth 10 --max-suspicious-reads-per-alignment-start 0 --normal-lod 2.2 --ignore-itr-artifacts false --gvcf-lod-band -2.5 --gvcf-lod-band -2.0 --gvcf-lod-band -1.5 --gvcf-lod-band -1.0 --gvcf-lod-band -0.5 --gvcf-lod-band 0.0 --gvcf-lod-band 0.5 --gvcf-lod-band 1.0 --minimum-allele-fraction 0.0 --independent-mates false --flow-mode NONE --disable-adaptive-pruning false --kmer-size 10 --kmer-size 25 --dont-increase-kmer-sizes-for-cycles false --allow-non-unique-kmers-in-ref false --num-pruning-samples 1 --min-dangling-branch-length 4 --recover-all-dangling-branches false --max-num-haplotypes-in-population 128 --min-pruning 2 --adaptive-pruning-initial-error-rate 0.001 --pruning-lod-threshold 2.302585092994046 --pruning-seeding-lod-threshold 9.210340371976184 --max-unpruned-variants 100 --linked-de-bruijn-graph false --disable-artificial-haplotype-recovery false --enable-legacy-graph-cycle-detection false --debug-assembly false --debug-graph-transformations false --capture-assembly-failure-bam false --num-matching-bases-in-dangling-end-to-recover -1 --error-correction-log-odds -Infinity --error-correct-reads false --kmer-length-for-read-error-correction 25 --min-observations-for-kmer-to-be-solid 20 --likelihood-calculation-engine PairHMM --base-quality-score-threshold 18 --dragstr-het-hom-ratio 2 --dont-use-dragstr-pair-hmm-scores false --pair-hmm-gap-continuation-penalty 10 --expected-mismatch-rate-for-read-disqualification 0.02 --pair-hmm-implementation FASTEST_AVAILABLE --pcr-indel-model CONSERVATIVE --phred-scaled-global-read-mismapping-rate 45 --disable-symmetric-hmm-normalizing false --disable-cap-base-qualities-to-map-quality false --enable-dynamic-read-disqualification-for-genotyping false --dynamic-read-disqualification-threshold 1.0 --native-pair-hmm-threads 4 --native-pair-hmm-use-double-precision false --flow-hmm-engine-min-indel-adjust 6 --flow-hmm-engine-flat-insertion-penatly 45 --flow-hmm-engine-flat-deletion-penatly 45 --pileup-detection false --use-pdhmm false --use-pdhmm-overlap-optimization false --make-determined-haps-from-pd-code false --print-pileupcalling-status false --fallback-gga-if-pdhmm-fails true --pileup-detection-enable-indel-pileup-calling false --pileup-detection-active-region-phred-threshold 0.0 --num-artificial-haplotypes-to-add-per-allele 5 --artifical-haplotype-filtering-kmer-size 10 --pileup-detection-snp-alt-threshold 0.1 --pileup-detection-indel-alt-threshold 0.1 --pileup-detection-absolute-alt-depth 0.0 --pileup-detection-snp-adjacent-to-assembled-indel-range 5 --pileup-detection-snp-basequality-filter 12 --pileup-detection-bad-read-tolerance 0.0 --pileup-detection-proper-pair-read-badness true --pileup-detection-edit-distance-read-badness-threshold 0.08 --pileup-detection-chimeric-read-badness true --pileup-detection-template-mean-badness-threshold 0.0 --pileup-detection-template-std-badness-threshold 0.0 --pileup-detection-filter-assembly-alt-bad-read-tolerance 0.0 --pileup-detection-edit-distance-read-badness-for-assembly-filtering-threshold 0.12 --bam-writer-type CALLED_HAPLOTYPES --dont-use-soft-clipped-bases false --override-fragment-softclip-check false --min-base-quality-score 10 --smith-waterman FASTEST_AVAILABLE --emit-ref-confidence NONE --max-mnp-distance 1 --force-call-filtered-alleles false --reference-model-deletion-quality 30 --soft-clip-low-quality-ends false --allele-informative-reads-overlap-margin 2 --smith-waterman-dangling-end-match-value 25 --smith-waterman-dangling-end-mismatch-penalty -50 --smith-waterman-dangling-end-gap-open-penalty -110 --smith-waterman-dangling-end-gap-extend-penalty -6 --smith-waterman-haplotype-to-reference-match-value 200 --smith-waterman-haplotype-to-reference-mismatch-penalty -150 --smith-waterman-haplotype-to-reference-gap-open-penalty -260 --smith-waterman-haplotype-to-reference-gap-extend-penalty -11 --smith-waterman-read-to-haplotype-match-value 10 --smith-waterman-read-to-haplotype-mismatch-penalty -15 --smith-waterman-read-to-haplotype-gap-open-penalty -30 --smith-waterman-read-to-haplotype-gap-extend-penalty -5 --flow-assembly-collapse-hmer-size 0 --flow-assembly-collapse-partial-mode false --flow-filter-alleles false --flow-filter-alleles-qual-threshold 30.0 --flow-filter-alleles-sor-threshold 3.0 --flow-filter-lone-alleles false --flow-filter-alleles-debug-graphs false --min-assembly-region-size 50 --max-assembly-region-size 300 --active-probability-threshold 0.002 --max-prob-propagation-distance 50 --force-active false --assembly-region-padding 100 --padding-around-indels 75 --padding-around-snps 20 --padding-around-strs 75 --max-extension-into-assembly-region-padding-legacy 25 --max-reads-per-alignment-start 50 --enable-legacy-assembly-region-trimming false --interval-set-rule UNION --interval-padding 0 --interval-exclusion-padding 0 --interval-merging-rule ALL --read-validation-stringency SILENT --seconds-between-progress-updates 10.0 --disable-sequence-dictionary-validation false --create-output-bam-index true --create-output-bam-md5 false --create-output-variant-index true --create-output-variant-md5 false --max-variants-per-shard 0 --lenient false --add-output-sam-program-record true --add-output-vcf-command-line true --cloud-prefetch-buffer 40 --cloud-index-prefetch-buffer -1 --disable-bam-index-caching false --sites-only-vcf-output false --help false --version false --showHidden false --verbosity INFO --QUIET false --use-jdk-deflater false --use-jdk-inflater false --gcs-max-retries 20 --gcs-project-for-requester-pays  --disable-tool-default-read-filters false --max-read-length 2147483647 --min-read-length 30 --minimum-mapping-quality 20 --disable-tool-default-annotations false --enable-all-annotations false&quot;,Version=&quot;4.5.0.0&quot;,Date=&quot;March 5, 2024 at 10:21:02 AM UTC&quot;&gt;
##INFO=&lt;ID=AS_SB_TABLE,Number=1,Type=String,Description=&quot;Allele-specific forward/reverse read counts for strand bias tests. Includes the reference and alleles separated by |.&quot;&gt;
##INFO=&lt;ID=AS_UNIQ_ALT_READ_COUNT,Number=A,Type=Integer,Description=&quot;Number of reads with unique start and mate end positions for each alt at a variant site&quot;&gt;
##INFO=&lt;ID=CONTQ,Number=1,Type=Float,Description=&quot;Phred-scaled qualities that alt allele are not due to contamination&quot;&gt;
##INFO=&lt;ID=DP,Number=1,Type=Integer,Description=&quot;Approximate read depth; some reads may have been filtered&quot;&gt;
##INFO=&lt;ID=ECNT,Number=1,Type=Integer,Description=&quot;Number of events in this haplotype&quot;&gt;
##INFO=&lt;ID=GERMQ,Number=1,Type=Integer,Description=&quot;Phred-scaled quality that alt alleles are not germline variants&quot;&gt;
##INFO=&lt;ID=MBQ,Number=R,Type=Integer,Description=&quot;median base quality by allele&quot;&gt;
##INFO=&lt;ID=MFRL,Number=R,Type=Integer,Description=&quot;median fragment length by allele&quot;&gt;
##INFO=&lt;ID=MMQ,Number=R,Type=Integer,Description=&quot;median mapping quality by allele&quot;&gt;
##INFO=&lt;ID=MPOS,Number=A,Type=Integer,Description=&quot;median distance from end of read&quot;&gt;
##INFO=&lt;ID=NALOD,Number=A,Type=Float,Description=&quot;Negative log 10 odds of artifact in normal with same allele fraction as tumor&quot;&gt;
##INFO=&lt;ID=NCount,Number=1,Type=Integer,Description=&quot;Count of N bases in the pileup&quot;&gt;
##INFO=&lt;ID=NLOD,Number=A,Type=Float,Description=&quot;Normal log 10 likelihood ratio of diploid het or hom alt genotypes&quot;&gt;
##INFO=&lt;ID=OCM,Number=1,Type=Integer,Description=&quot;Number of alt reads whose original alignment doesn't match the current contig.&quot;&gt;
##INFO=&lt;ID=PON,Number=0,Type=Flag,Description=&quot;site found in panel of normals&quot;&gt;
##INFO=&lt;ID=POPAF,Number=A,Type=Float,Description=&quot;negative log 10 population allele frequencies of alt alleles&quot;&gt;
##INFO=&lt;ID=ROQ,Number=1,Type=Float,Description=&quot;Phred-scaled qualities that alt allele are not due to read orientation artifact&quot;&gt;
##INFO=&lt;ID=RPA,Number=R,Type=Integer,Description=&quot;Number of times tandem repeat unit is repeated, for each allele (including reference)&quot;&gt;
##INFO=&lt;ID=RU,Number=1,Type=String,Description=&quot;Tandem repeat unit (bases)&quot;&gt;
##INFO=&lt;ID=SEQQ,Number=1,Type=Integer,Description=&quot;Phred-scaled quality that alt alleles are not sequencing errors&quot;&gt;
##INFO=&lt;ID=STR,Number=0,Type=Flag,Description=&quot;Variant is a short tandem repeat&quot;&gt;
##INFO=&lt;ID=STRANDQ,Number=1,Type=Integer,Description=&quot;Phred-scaled quality of strand bias artifact&quot;&gt;
##INFO=&lt;ID=STRQ,Number=1,Type=Integer,Description=&quot;Phred-scaled quality that alt alleles in STRs are not polymerase slippage errors&quot;&gt;
##INFO=&lt;ID=TLOD,Number=A,Type=Float,Description=&quot;Log 10 likelihood ratio score of variant existing versus not existing&quot;&gt;
##MutectVersion=2.2
##contig=&lt;ID=chr2,length=242193529&gt;
##contig=&lt;ID=chr20,length=64444167&gt;
##contig=&lt;ID=chr4,length=190214555&gt;
##filtering_status=Warning: unfiltered Mutect 2 calls.  Please run FilterMutectCalls to remove false positives.
##source=Mutect2
##tumor_sample=312092_15-Ctrl4_H01_S11_R1_001.fastq.gz
#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  312092_15-Ctrl4_H01_S11_R1_001.fastq.gz
chr20   4699818 .   G   A   .   .   AS_SB_TABLE=22,12|0,0;DP=48;ECNT=1;MBQ=11,0;MFRL=243,0;MMQ=60,60;MPOS=50;POPAF=7.30;TLOD=-1.584e+00 GT:AD:AF:DP:F1R2:F2R1:FAD:SB    0/1:34,0:0.026:34:0,0:0,0:33,0:22,12,0,0
</code></pre>
<p><strong>Desired output</strong> (values from the first VCF above, with tabs as delimiter)</p>
<pre><code>Sample CHROM    POS ID  REF ALT QUAL    FILTER  GT INFO-DP FORMAT-DP AD-REF AD-ALT
312091_8-Ctrl5_H02_S3_R1_001.fastq.gz chr20 4699818 . G A . . 0/1 2939 2778 2778 0
</code></pre>
<p>I suppose merging them would be an option. Is there a method to extract the information I'd like from a merged VCF?</p>

<vcf><genomics>
How do I summarise VCF files?
# How do I summarise VCF files?

(Asked by: username_0 on 2024-03-05)

I have got a number of VCF files that all contain data on one particular variant, with every VCF being created from an individual sample. So there is one entry per file (headers omitted):
##source=Mutect2
##tumor_sample=312091_5-Ctrl1_G01_S6_R1_001.fastq.gz
#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  312091_5-Ctrl1_G01_S6_R1_001.fastq.gz
chr20   4699818 .   G   A   .   .   AS_SB_TABLE=805,864|0,0;DP=1871;ECNT=1;MBQ=17,0;MFRL=273,0;MMQ=60,60;MPOS=50;POPAF=7.30;TLOD=-3.537e+00 GT:AD:AF:DP:F1R2:F2R1:FAD:SB    0/1:1669,0:6.794e-04:1669:252,0:233,0:1595,0:805,864,0,0

I would like to create a summary table of the parameters given within the VCFs, including of the parameters within the FORMAT field. Ideally this table would have the following as header:
Sample CHROM    POS ID  REF ALT QUAL    FILTER  GT INFO-DP FORMAT-DP AD-REF AD-ALT

and every sample/variant combination would be a line. I would like to use such a table to create statistics for my samples (on zygosity, number of ALT variants etc).
Is there a pre-made tool that is capable of doing this? I'm also open to any other suggestions. Thanks!
Edit:
Here are two VCF files (I have about 30 in total) and the desired output
First VCF:
##fileformat=VCFv4.2
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##GATKCommandLine=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##MutectVersion=2.2
##contig=
##contig=
##contig=
##filtering_status=Warning: unfiltered Mutect 2 calls.  Please run FilterMutectCalls to remove false positives.
##source=Mutect2
##tumor_sample=312091_8-Ctrl5_H02_S3_R1_001.fastq.gz
#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  312091_8-Ctrl5_H02_S3_R1_001.fastq.gz
chr20   4699818 .   G   A   .   .   AS_SB_TABLE=1376,1402|0,0;DP=2939;ECNT=1;MBQ=18,0;MFRL=257,0;MMQ=60,60;MPOS=50;POPAF=7.30;TLOD=-3.455e+00   GT:AD:AF:DP:F1R2:F2R1:FAD:SB    0/1:2778,0:4.100e-04:2778:472,0:398,0:2493,0:1376,1402,0,0

Second VCF:
##fileformat=VCFv4.2
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##FORMAT=
##GATKCommandLine=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##INFO=
##MutectVersion=2.2
##contig=
##contig=
##contig=
##filtering_status=Warning: unfiltered Mutect 2 calls.  Please run FilterMutectCalls to remove false positives.
##source=Mutect2
##tumor_sample=312092_15-Ctrl4_H01_S11_R1_001.fastq.gz
#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  312092_15-Ctrl4_H01_S11_R1_001.fastq.gz
chr20   4699818 .   G   A   .   .   AS_SB_TABLE=22,12|0,0;DP=48;ECNT=1;MBQ=11,0;MFRL=243,0;MMQ=60,60;MPOS=50;POPAF=7.30;TLOD=-1.584e+00 GT:AD:AF:DP:F1R2:F2R1:FAD:SB    0/1:34,0:0.026:34:0,0:0,0:33,0:22,12,0,0

Desired output (values from the first VCF above, with tabs as delimiter)
Sample CHROM    POS ID  REF ALT QUAL    FILTER  GT INFO-DP FORMAT-DP AD-REF AD-ALT
312091_8-Ctrl5_H02_S3_R1_001.fastq.gz chr20 4699818 . G A . . 0/1 2939 2778 2778 0

I suppose merging them would be an option. Is there a method to extract the information I'd like from a merged VCF?

**Tags:** vcf, genomics

---

## 2 answers

### Answer by username_4 on 2024-03-05. Score: 4 | Accepted answer

The first step is to merge your VCFs. For this, you need to compress them with bgzip and then index with tabix:
for file in *vcf; do
  bgzip "$file"
  tabix "$file".gz
done

Now, feed the files to bcftools merge. In this example, I have saved your two files as sample1.vcf.gz and sample2.vcf.gz, and they're the only vcf files in the directory, so I can catch them all with *vcf.gz:
bcftools merge *.vcf.gz > merged.vcf

This results in a file containing a single variant line, with an entry for each of the two samples:
chr20   4699818 .   G   A   .   .   AS_SB_TABLE=1376,1402|0,0;ECNT=1;DP=2987;MBQ=11,0;MFRL=243,0;MMQ=60,60;MPOS=50;POPAF=7.3;TLOD=-1.584    GT:AD:AF:DP:F1R2:F2R1:FAD:SB    0/1:2778,0:0.00041:2778:472,0:398,0:2493,0:1376,1402,0,0    0/1:34,0:0.026:34:0,0:0,0:33,0:22,12,0,0

From this, bcftools query can give you almost exactly what you need. The main problem is that when merging, the INFO fields are not combined. Only one is kept. In my test, it was the one from the last file processed, but this could be random, I don't know. This is the closest I could get to your desired format:
$ { printf 'Sample\tCHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tGT\tFORMAT-DP\tAD\n'; 
  bcftools query --format "[%SAMPLE ]\t%CHROM\t%POS0\t%ID\t%REF\t%ALT\t%QUAL\t%FILTER\t[%GT ]\t[%DP ]\t[%AD ] " merged.vcf ; } | column -s$'\t' -t
Sample                                                                          CHROM  POS      ID  REF  ALT  QUAL  FILTER  GT          FORMAT-DP  AD
312091_8-Ctrl5_H02_S3_R1_001.fastq.gz 312092_15-Ctrl4_H01_S11_R1_001.fastq.gz   chr20  4699817  .   G    A    .     .        0/1  0/1   2778 34    2778,0 34,0  

The main command is this:
bcftools query --format "[%SAMPLE ]\t%CHROM\t%POS0\t%ID\t%REF\t%ALT\t%QUAL\t%FILTER\t[%GT ]\t[%DP ]\t[%AD ] " merged.vcf

The rest just add a header and pretty formatting for clarity. Please see https://samtools.github.io/bcftools/bcftools.html#query for details on the options used.
This is close, but not quite. You have the sample names listed on the same line, we're missing the DP value from the FORMAT field and we have the ADs shown in pairs, not in different columns as requested. A little post-processing can fix everything except the missing DP/FORMAT:
$ { 
  printf 'Sample\tCHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tGT\tFORMAT-DP\tAD-REF\tAD-ALT\n'; 
  bcftools query --format "[%SAMPLE ]\t%CHROM\t%POS0\t%ID\t%REF\t%ALT\t%QUAL\t%FILTER\t[%GT ]\t[%DP ]\t[%AD ] " merged.vcf | 
   awk -F'\t' -v OFS="\t" '
  { 
    split($1, samples, " "); 
    split($9, genotypes, " "); 
    split($10, dps, " ");
    split($11, ads, " "); 
    for(s in samples){ 
       split(ads[s], sampleAd, ",");  
       print samples[s], $2, $3, $4, $5, $6, $7, $8, genotypes[s], dps[s], sampleAd[1], sampleAd[2]
     }
  }'; 
} | column -s$'\t' -t
Sample                                   CHROM  POS      ID       REF  ALT  QUAL  FILTER  GT   FORMAT-DP  AD-REF  AD-ALT
312091_8-Ctrl5_H02_S3_R1_001.fastq.gz    chr20  4699817  .  G    A    .     .       0/1  2778       2778    0
312092_15-Ctrl4_H01_S11_R1_001.fastq.gz  chr20  4699817 .  G    A    .     .       0/1  34         34      0


Important: the command above assumes there are no spaces in your sample names nor in any of the values returned. It also assumes only one ALT allele per variant. Please update your question if these assumptions are not valid.
This is as close as I can get it using "standard" tools and relatively little post-processing. It is everything you asked for except the INFO DP. If you absolutely must have that too (which seems a bit odd, honestly, you usually want the one actually reported for the variant), I fear that will require just parsing the whole thing manually.

> **Comments:**
> **username_0**: this is exactly what I needed, thank you so much!  

---

### Answer by username_1 on 2024-03-07. Score: -1

The simplest alternative is to have a directory with all the vcf files you want to merge, and use bcftools merge. Example:
vcf_dir=path_to_your_vcf_directory
bcftools merge $vcf_dir/*.vcf -o bcftools_merged.vcf

> **Comments:**
> **username_2**: This does not answer the question. It's literally the second step from terdon's answer, so I don't see why this deserves to be its own answer.  
> **username_3**: Just to point out @RamRS does have a valid complaint.  

---

