如何根据第一列拆分 vcf.gz 文件,在每个子集中保留 header 并保存回 vcf.gz 文件

How to split a vcf.gz file based on the first column, keeping the header in each subset and save back to vcf.gz files

我有一个很大的 vcf.gz 文件 (40GB),我必须拆分它才能加载到 R 中,并且 运行 每个子集上都有一个脚本。 我想将其拆分为与

一起使用的第一列
zcat large_data.vcf.gz | cut -f1,2-5,8- | awk '{ print | ("gzip -c > " ".vcf.gz") }'

但我想在每个子集中保存 header。 header 没有保存到拆分数据中(我认为它会做的)。可能是因为 header 以 #

开头
#col1  col2  col3  col4  col5  col6  col7  col8

我试过了

zcat large_data1.vcf.gz | cut -f1,2-5,8- | 
    awk 'NR == 1{header = [=15=]; next} 
    !( in filename){ print header | (“gzip -c > “  ".vcf.gz") } 
    NR > 1 { print [=15=] | (“gzip -c > “  ".vcf.gz"); filename[] }' file

但是哪里出了问题...

有什么想法吗?
PS: -- 过滤器不是可识别的选项

编辑:数据示例

#col1  col2  col3  col4  col5  col6  col7  col8
1  100  100  100  1000  110  100  110
1  110  100  110  500  200  150  160
2  140  120  100  1000  110  160  210
2  110  180  170  700  220  150  120

需要的数据 1-

#col1  col2  col3  col4  col5  col6  col7  col8
1  100  100  100  1000  110  100  110
1  110  100  110  500  200  150  160

和 2-

#col1  col2  col3  col4  col5  col6  col7  col8
2  140  120  100  1000  110  160  210
2  110  180  170  700  220  150  120

您可能需要在 awk 程序中保存 header 和文件名:

zcat large_data.vcf.gz |
cut -f1,2-5,8- |
awk '
    BEGIN{ getline header }
    {
        filename = ".vcf.gz"
        if (!seen[]) {
            print header | ("gzip -c > " filename)
            seen[]++
        }
        print | ("gzip -c > " filename)
    }
'

备注:为什么getline?因为对 40GB 的文件使用 NR==1NR>1 会不必要地变慢

我只是让它与这段代码一起工作,但它在每一行的顶部添加了 header

zcat large_data.vcf.gz | 
cut -f1,2-5,8- | 
awk 'NR == 1{header = [=10=]; next} 
!( in filename){ print header | "gzip > "  ".vcf.gz" } 
NR > 1 { print [=10=] | "gzip > "  ".vcf.gz" }'