web-dev-qa-db-ja.com

awkを圧縮ファイルに使用する方法

圧縮ファイルの次のコマンドを変更するにはどうすればよいですか?

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

コマンドは通常のファイルで正常に動作します。圧縮ファイルのコマンドを変更する必要があります。

26
AKR

次のような圧縮ファイルを読み取る必要があります。

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
23
Steve
zcat FILE | awk '{ ...}'

これらすべてのメソッドのどれが最適に機能するかを知ることはできません。zcatは少なくともタイプするのが速いです;)

13
runlevel0
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

これは、結果を標準出力に出力するすべてのプログラムで機能します。

ところで、そのような大きなコマンドラインの編集は、非常に手間がかかります。あなたは仕事をするために小さなシェルスクリプトを書くことを考慮すべきです。これには、全体を覚える必要がないという利点があり、必要に応じてコマンドを簡単に繰り返したり変更したりできます。

Linux Shellプログラミングの良い出発点は、Mike Gによる Bash Programming Inroduction です。

6
Mackie Messer