如何在压缩文件中使用awk

28

如何更改以下命令以适用于压缩文件?

awk 'FNR==NR { array[$1,$2]=$8; next } ($1,$2) in array { print $0 ";" array[$1,$2] }' input1.vcf input2.vcf

这个命令在正常文件上运行良好。我需要修改命令以处理压缩文件。

3个回答

26

你需要像这样读取压缩文件:

awk '{ ... }' <(gzip -dc input1.vcf.gz) <(gzip -dc input2.vcf.gz)

试一下这个:

awk 'FNR==NR { sub(/AA=\.;/,""); array[$1,$2]=$8; next } ($1,$2) in array { print $0 ";" array[$1,$2] }' <(gzip -dc input1.vcf.gz) <(gzip -dc input2.vcf.gz) | gzip > output.vcf.gz

zcat 相当于 gzip -dc(在某些系统上可能是 gzcat)。 - arekolek

19
zcat FILE | awk '{ ...}'

我无法确定所有这些方法中哪种方法最好,但至少zcat的输入速度更快 ;)


4
我使用gzcat代替zcat,在不同的操作系统中二者并不完全相同。 - nevets1219

6
bzip2 -dc input1.vcf.bz2 input2.vcf.bz2 | awk 'FNR==NR { array[$1,$2]=$8; next } ($1,$2) in array { print $0 ";" array[$1,$2] }'

或者

gzip -dc input1.vcf.gz input2.vcf.gz | awk 'FNR==NR { array[$1,$2]=$8; next } ($1,$2) in array { print $0 ";" array[$1,$2] }'

编辑:

为了输出压缩的内容,只需要在末尾添加

| bzip2 >output.vcf.bz2

或者

| gzip >output.vcf.gz

这将适用于任何输出结果到标准输出的程序。
顺便提一句:编辑这样大的命令行会很快变得乏味。你应该考虑编写一个小的shell脚本来完成这项工作。这还有额外的好处,即你不必记住整个命令,并且可以轻松重复执行或在必要时修改它。
Linux shell编程的一个很好的起点是Mike G.撰写的Bash编程介绍

输出结果是否为.gz格式gzip -dc input1.vcf.gz input2.vcf.gz | awk 'FNR==NR { array[$1,$2]=$8; next } ($1,$2) in array { print $0 ";" array[$1,$2] }' > output.vcf.gz - AKR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接