如何完整提取带尾部冗余的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 ignoredpigz -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给出的压缩大小拆分:
- 拆分第一个gzip块:
# 替换17965为对应文件的第一个compressed数值 dd if=chr22-filtered.dose.vcf.gz of=part1.gz bs=1 count=17965
- 拆分第二个gzip块:
dd if=chr22-filtered.dose.vcf.gz of=part2.gz bs=1 skip=17965
- 合并解压:
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
相关产品推荐
相关产品推荐

