You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何完整提取带尾部冗余的gzipped VCF文件内容?

解决拼接式gzip VCF文件无法完整提取的问题

问题概述

从dbGaP获取的加密tar包解密后,通过tar -xvf phg001.tar提取的VCF.gz文件存在异常:

  • Plink转换VCF到bed时报错:Error: Line 20 of .vcf file has fewer tokens than expected.
  • zcat统计行数仅返回19行,解压时提示decompression OK, trailing garbage ignored
  • pigz -ltv显示每个文件包含两个独立的gzip压缩流,尾部"垃圾"实际是第二个完整的gzip块

解决方案

方法1:直接合并解压(推荐)

gzip/pigz原生支持处理多流gzip文件,直接将所有流解压合并:

# 用zcat处理,忽略警告
zcat chr22-filtered.dose.vcf.gz > chr22-filtered.dose.vcf 2>/dev/null

# 或用pigz更快处理
pigz -dc chr22-filtered.dose.vcf.gz > chr22-filtered.dose.vcf 2>/dev/null

方法2:手动拆分后合并

如果需要拆分验证,可根据pigz -ltv给出的压缩大小拆分:

  1. 拆分第一个gzip块:
# 替换17965为对应文件的第一个compressed数值
dd if=chr22-filtered.dose.vcf.gz of=part1.gz bs=1 count=17965
  1. 拆分第二个gzip块:
dd if=chr22-filtered.dose.vcf.gz of=part2.gz bs=1 skip=17965
  1. 合并解压:
zcat part1.gz part2.gz > chr22-filtered.dose.vcf

方法3:批量处理所有文件

对目录下所有*.dose.vcf.gz批量处理:

for gz_file in *.dose.vcf.gz; do
    pigz -dc "$gz_file" > "${gz_file%.gz}" 2>/dev/null
    echo "Completed: ${gz_file%.gz}"
done

验证步骤

处理后确认文件完整性:

# 统计VCF行数(应远大于20)
wc -l chr22-filtered.dose.vcf

# 重新测试Plink转换
plink --vcf chr22-filtered.dose.vcf --make-bed --out chr22_output

根因

这类文件是两个独立的gzip包意外拼接而成,常规解压工具默认只读取第一个gzip流就终止,剩余内容被识别为"尾部垃圾"。直接用wc -l统计压缩文件的行数无意义,因为统计的是二进制压缩数据的行数,而非原始VCF内容。

内容的提问来源于stack exchange,提问作者PaulJ2.0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:47:37