如何根据第一列拆分 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==1
和 NR>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" }'
我有一个很大的 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==1
和 NR>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" }'