我们需要下载一个 182 GB 的压缩文件(未压缩为TSV)。但是,我们只需要文件的前五列,大约相当于 1 GB。
是否有一些奇特的 shell 魔法可以用来下载文件的子集?
下载整个文件只是为了删除 99% 的内容,这确实会耗尽我们服务器的存储空间。
正在下载的内容: 来自gnomad.broadinstitute.org的gnomad.genomes.v3.1.2.sites.chr1.vcf.bgz。
欢迎任何替代解决方案。我对也适用于非压缩文件的解决方案感兴趣。
要点是,当我只需要该文件的子集时,如何避免下载大量文件?
roa*_*ima 31
您可以下载该文件,对其进行过滤,然后将结果写入本地磁盘
\ncurl https://storage.googleapis.com/gcp-public-data--gnomad/release/3.1.2/vcf/genomes/gnomad.genomes.v3.1.2.sites.chr1.vcf.bgz |\n bgzip -d |\n cut -f1-5\n
Run Code Online (Sandbox Code Playgroud)\n这仍然需要您下载完整的文件,但只有过滤后的文件才会写入磁盘。
\n在 Debian 上,该bgzip
命令由软件包提供tabix
。但如果未安装,您也可以使用来读取压缩文件 ( gzip
) 。zcat
bgzip
curl \xe2\x80\xa6 | zcat | cut -f1-5
我对该管道所需的数据存储量有一些疑问。这是一次真正的跑步。请注意,在此系统上我总共只有 2GB 可用存储空间;即使压缩,下载和保存文件所需的 182GB 也相差甚远:
\n# How much disk space available in my current directory?\ndf -h .\nFilesystem Size Used Avail Use% Mounted on\n/dev/root 7.9G 5.6G 2.0G 75% /\n\n# Download and filter the file, saving only the result\ncurl https://storage.googleapis.com/gcp-public-data--gnomad/release/3.1.2/vcf/genomes/gnomad.genomes.v3.1.2.sites.chr1.vcf.bgz |\nbgzip -d |\ncut -f1-5 > bigfile\n\n# What did we get, and how much disk space remains?\nls -lh bigfile\n-rw-r--r-- 1 roaima roaima 1.7G Feb 7 05:09 bigfile\n\ndf -h .\nFilesystem Size Used Avail Use% Mounted on\n/dev/root 7.9G 7.2G 347M 96% /\n
Run Code Online (Sandbox Code Playgroud)\n有趣的是,我注意到该文件并不是严格的TSV(制表符分隔值)格式。在其 59,160,934 行中,942 行不包含制表符分隔的数据。
\nfile bigfile\nbigfile: Variant Call Format (VCF) version 4.2, ASCII text, with very long lines\n
Run Code Online (Sandbox Code Playgroud)\n
小智 18
根本不存在。
我查看了数据,正如你所说,文件很大,所以我没有下载它。
你说的第二件事是 TSV 文件:
...我们只需要二进制 TSV 格式文件的前 5 列...
如果我正确解释您的缩写,您的意思TSV
是 as in Tab Separated Value
file,在这种情况下它是常规文本文件而不是二进制文件。当然,从某些角度来看,即使文本文件也是二进制文件 - 但在这种情况下我们讨论的是文本文件。
然而该文件确实被压缩了:
: curl -s -L https://storage.googleapis.com/gcp-public-data--gnomad/release/3.1.2/vcf/genomes/gnomad.genomes.v3.1.2.sites.chr1.vcf.bgz | file -
/dev/stdin: Blocked GNU Zip Format (BGZF; gzip compatible), block length 4462
Run Code Online (Sandbox Code Playgroud)
正如有人已经回答的那样,这意味着,您可以使用流技术动态解包文件,通过管道将其发送到解压缩器。bgzcat
我的发行版中似乎不存在,但是zcat
,它非常通用,在我的发行版中并且知道如何读取此压缩流:
: curl -s -L https://storage.googleapis.com/gcp-public-data--gnomad/release/3.1.2/vcf/genomes/gnomad.genomes.v3.1.2.sites.chr1.vcf.bgz | zcat | head -n 1
##fileformat=VCFv4.2
Run Code Online (Sandbox Code Playgroud)
进一步调查,文件开头有注释:
curl -L https://storage.googleapis.com/gcp-public-data--gnomad/release/3.1.2/vcf/genomes/gnomad.genomes.v3.1.2.sites.chr1.vcf.bgz | zcat | head -n 80
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0##fileformat=VCFv4.2
##hailversion=0.2.77-684f32d73643
##FILTER=<ID=AC0,Description="Allele count is zero after filtering out low-confidence genotypes (GQ < 20; DP < 10; and AB < 0.2 for het calls)">
##FILTER=<ID=AS_VQSR,Description="Failed VQSR filtering thresholds of -2.7739 for SNPs and -1.0606 for indels">
##FILTER=<ID=InbreedingCoeff,Description="InbreedingCoeff < -0.3">
##FILTER=<ID=PASS,Description="Passed all variant filters">
##INFO=<ID=AC,Number=A,Type=Integer,Description="Alternate allele count">
##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles">
##INFO=<ID=AF,Number=A,Type=Float,Description="Alternate allele frequency">
##INFO=<ID=popmax,Number=A,Type=String,Description="Population with maximum allele frequency">
##INFO=<ID=faf95_popmax,Number=A,Type=Float,Description="Filtering allele frequency (using Poisson 95% CI) for the population with the maximum allele frequency">
##INFO=<ID=AC_non_v2_XX,Number=A,Type=Integer,Description="Alternate allele count for XX samples in non_v2 subset">
##INFO=<ID=AN_non_v2_XX,Number=1,Type=Integer,Description="Total number of alleles in XX samples in non_v2 subset">
##INFO=<ID=AF_non_v2_XX,Number=A,Type=Float,Description="Alternate allele frequency in XX samples in non_v2 subset">
##INFO=<ID=nhomalt_non_v2_XX,Number=A,Type=Integer,Description="Count of homozygous individuals in XX samples in non_v2 subset">
##INFO=<ID=AC_non_cancer_fin_XX,Number=A,Type=Integer,Description="Alternate allele count for XX samples of Finnish ancestry in non_cancer subset">
##INFO=<ID=AN_non_cancer_fin_XX,Number=1,Type=Integer,Description="Total number of alleles in XX samples of Finnish ancestry in non_cancer subset">
##INFO=<ID=AF_non_cancer_fin_XX,Number=A,Type=Float,Description="Alternate allele frequency in XX samples of Finnish ancestry in non_cancer subset">
Run Code Online (Sandbox Code Playgroud)
最后@943行可能标题开始:
: curl -s -L https://storage.googleapis.com/gcp-public-data--gnomad/release/3.1.2/vcf/genomes/gnomad.genomes.v3.1.2.sites.chr1.vcf.bgz | zcat | tail -n+943 | head -n 1
#CHROM POS ID REF ALT QUAL FILTER INFO
Run Code Online (Sandbox Code Playgroud)
我懒得确定第一个数据行中哪个实际上是列分隔符,但似乎“\t”确实是列分隔符:
: curl -s -L https://storage.googleapis.com/gcp-public-data--gnomad/release/3.1.2/vcf/genomes/gnomad.genomes.v3.1.2.sites.chr1.vcf.bgz | zcat | tail -n+944 | head -n 1
chr1 10031 . T C . AC0;AS_VQSR AC=0;AN=56642;AF=0.00000;AC_non_v2_XX=0;AN_non_v2_XX=23674;AF_non_v2_XX=0.00000;nhomalt_non_v2_XX=0;AC_non_cancer_fin_XX=0;AN_non_cancer_fin_XX=1060;AF_non_cancer_fin_XX=0.00000;nhomalt_non_cancer_fin_XX=0;AC_non_neuro_nfe=0;AN_non_neuro_nfe=24462;AF_non_neuro_nfe=0.00000;nhomalt_non_neuro_nfe=0;AC_non_neuro_afr_XY=0;AN_non_neuro_afr_XY=5226;AF_non_neuro_afr_XY=0.00000;nhomalt_non_neuro_afr_XY=0;AC_non_neuro_nfe_XY=0;AN_non_neuro_nfe_XY=9974;AF_non_neuro_nfe_XY=0.00000;nhomalt_non_neuro_nfe_XY=0;AC_controls_and_biobanks_eas_XY=0;AN_controls_and_biobanks_eas_XY=392;AF_controls_and_biobanks_eas_XY=0.00000;nhomalt_controls_and_biobanks_eas_XY=0;AC_non_neuro_sas_XX=0;AN_non_neuro_sas_XX=260;AF_non_neuro_sas_XX=0.00000;nhomalt_non_neuro_sas_XX=0;AC_non_v2=0;AN_non_v2=44696;AF_non_v2=0.00000;nhomalt_non_v2=0;AC_non_topmed_nfe_XX=0;AN_non_topmed_nfe_XX=2800;AF_non_topmed_nfe_XX=0.00000;nhomalt_non_topmed_nfe_XX=0;AC_non_v2_mid=0;AN_non_v2_mid=192;AF_non_v2_mid=0.00000;nhomalt_non_v2_mid=0;AC_non_topmed_sas=0;AN_non_topmed_sas=1114;AF_non_topmed_sas=0.00000;nhomalt_non_topmed_sas=0;AC_non_cancer_eas_XX=0;AN_non_cancer_eas_XX=746;AF_non_cancer_eas_XX=0.00000;nhomalt_non_cancer_eas_XX=0;AC_amr_XY=0;AN_amr_XY=3650;AF_amr_XY=0.00000;nhomalt_amr_XY=0;AC_non_v2_nfe_XX=0;AN_non_v2_nfe_XX=12970;AF_non_v2_nfe_XX=0.00000;nhomalt_non_v2_nfe_XX=0;AC_controls_and_biobanks_XY=0;AN_controls_and_biobanks_XY=6960;AF_controls_and_biobanks_XY=0.00000;nhomalt_controls_and_biobanks_XY=0;AC_non_neuro_asj_XY=0;AN_non_neuro_asj_XY=722;AF_non_neuro_asj_XY=0.00000;nhomalt_non_neuro_asj_XY=0;AC_oth=0;AN_oth=782;AF_oth=0.00000;nhomalt_oth=0;AC_non_topmed_mid_XY=0;AN_non_topmed_mid_XY=82;AF_non_topmed_mid_XY=0.00000;nhomalt_non_topmed_mid_XY=0;AC_non_cancer_asj_XX=0;AN_non_cancer_asj_XX=770;AF_non_cancer_asj_XX=0.00000;nhomalt_non_cancer_asj_XX=0;AC_sas_XY=0;AN_sas_XY=860;AF_sas_XY=0.00000;nhomalt_sas_XY=0;AC_non_neuro_fin=0...
Run Code Online (Sandbox Code Playgroud)
这就是你的数据。
现在的问题是:
bgzip
压缩,所以无论如何都不可能使用字节范围
鉴于最后一点,你可以按照@user10489所说的去做:
curl
其通过管道传输到zcat
zcat
到一些快速组合在一起的脚本的输入:perl、python、php、luasqlite3
) - 您还必须忽略上述数据集开头的注释。最终的用法看起来像这样:
: curl -s -L https://storage.googleapis.com/gcp-public-data--gnomad/release/3.1.2/vcf/genomes/gnomad.genomes.v3.1.2.sites.chr1.vcf.bgz | zcat | myscript my-outfile.tsv
Run Code Online (Sandbox Code Playgroud)
你明白了。
这在几分钟/几小时内就可以完成,具体取决于您的能力,但现在您将遇到以下问题:
curl
过早地切断与管道头部的链接 - 这意味着您仍然无法流式传输整个内容文件下来。因此,在您的情况下,我会去找项目/研究领导或管理人员并请求资源:驱动器,也许是虚拟机/节点,按预期下载整个文件并在本地进行预处理。分析生成的预处理 5 列文件长度/大小,然后仅将其上传到服务器。
您不会依赖谷歌服务器不切断您的管道,并且您可以根据需要多次重新运行和调整管道。您不必担心“存储空间‘只能’容纳 5 列吗?” 也有疑问。
希望有帮助。
wget -O - | bgzcat |
,并使用基于流的工具,这些工具可以在标准输入上获取输入并将所需内容写入标准输出或文件。