web-dev-qa-db-fra.com

Comment utiliser awk pour un fichier compressé

Comment puis-je modifier la commande suivante pour un fichier compressé?

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

La commande fonctionne correctement avec un fichier normal. J'ai besoin de changer la commande des fichiers compressés.

26
AKR

Vous devez les lire comme des fichiers compressés:

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

Essaye ça:

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 '{ ...}'

Je ne pourrais pas dire laquelle de toutes ces méthodes fonctionne le mieux, zcat est au moins plus rapide à taper;)

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] }'

ou

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] }'

ÉDITER:

Pour écrire une sortie compressée, ajoutez simplement

| bzip2 >output.vcf.bz2

ou

| gzip >output.vcf.gz

Cela fonctionnera avec tout programme qui imprime les résultats sur une sortie standard.

BTW: La modification de telles grandes lignes de commande devient très fastidieuse. Vous devriez envisager d'écrire un petit script Shell pour faire le travail. Cela présente l'avantage supplémentaire de ne pas avoir à se souvenir de tout et peut facilement répéter la commande ou la modifier si nécessaire.

Un bon point de départ pour la programmation Linux Shell est le Bash Programming Inroduction par Mike G.

6
Mackie Messer