圧縮ファイルの次のコマンドを変更するにはどうすればよいですか?
awk 'FNR==NR { array[$1,$2]=$8; next } ($1,$2) in array { print $0 ";" array[$1,$2] }' input1.vcf input2.vcf
コマンドは通常のファイルで正常に機能します。圧縮ファイルのコマンドを変更する必要があります。
次のような圧縮ファイルを読み取る必要があります。
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 FILE | awk '{ ...}'
これらすべての方法のどれが最も効果的かはわかりませんが、zcat は少なくとも入力が速いです ;)
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 シェル プログラミングの良い出発点は、Mike G によるBash Programming Inroduction です。