2012-10-30 32 views
17

Jak zmienić następujące polecenie dla skompresowanego pliku?Sposób korzystania z awk dla skompresowanego pliku

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

Polecenie działa poprawnie z normalnym plikiem. Muszę zmienić polecenie dla skompresowanych plików.

Odpowiedz

17

trzeba je odczytać pliki skompresowane tak:

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

Spróbuj:

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' jest odpowiednikiem' gzip -dc' (w niektórych systemach może to być '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] }' 

lub

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:

Aby napisać wyjście sprężonego prostu dołączyć

| bzip2 >output.vcf.bz2 

lub

| gzip >output.vcf.gz 

To będzie działać z każdym programem, który drukuje wyniki na standardowe wyjście.

BTW: Edycja tak dużych wierszy poleceń bardzo szybko staje się nudna. Powinieneś rozważyć napisanie małego skryptu powłoki, aby wykonać zadanie. Ma to dodatkową zaletę, że nie musisz pamiętać całej rzeczy i możesz łatwo powtórzyć polecenie lub zmodyfikować je, jeśli to konieczne.

Dobrym punktem wyjścia do programowania powłoki systemu Linux jest Bash Programming Inroduction Mike G.

+0

Czy to wyjście będzie w formacie gz gzip -dc input1.vcf.gz ** input2.vcf.gz | awk 'FNR == NR {tablica [1 $, 2 $] = 8 $; next} (1 $, 2 $) w tablicy {print $ 0 ";" array [$ 1, 2 $]} '> output.vcf.gz ** – AKR

+1

@ user1782877: Spróbuj: 'command | gzip> output.vcf.gz' – Steve

+0

@ user1782877 Zobacz zaktualizowany anser. –

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

Nie będę w stanie stwierdzić, która z tych metod działa najlepiej, zcat jest co najmniej szybsze do wpisania;)

+2

Zamiast zcat użyłem' gzcat' - nie jest dokładnie takie samo w systemie operacyjnym – nevets1219