2012-10-30 10 views
17

Come posso modificare il seguente comando per un file compresso?Come utilizzare awk per un file compresso

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

Il comando funziona correttamente con file normale. Devo cambiare il comando per i file compressi.

risposta

17

avete bisogno di leggere loro file compressi in questo modo:

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

Prova questo:

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 
+0

'zcat' è equivalente a' gzip -dc' (su alcuni sistemi potrebbe essere 'gzcat') – arekolek

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

o

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

EDIT:

Per scrivere output compresso basta aggiungere

| bzip2 >output.vcf.bz2 

o

| gzip >output.vcf.gz 

Funzionerà con qualsiasi programma che stampa i risultati sullo standard output.

BTW: La modifica di righe di comando così grandi diventa noiosa molto rapidamente. Dovresti considerare di scrivere un piccolo script di shell per fare il lavoro. Questo ha l'ulteriore vantaggio di non dover ricordare l'intera cosa e può facilmente ripetere il comando o modificarlo se necessario.

Un buon punto di partenza per Linux programmazione della shell è il Bash Programming Inroduction da Mike G.

+0

L'output sarà in formato 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

+1

@ user1782877: Prova: 'comando | gzip> output.vcf.gz' – Steve

+0

@ user1782877 Vedere l'anser aggiornato. –

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

Non sarei in grado di dire quale di questi metodi funzioni meglio, zcat è almeno più veloce da digitare;)

+2

Invece di zcat, ho usato' gzcat' - non esattamente lo stesso su tutto il sistema operativo – nevets1219