Как использовать awk для сжатого файла

19

Как я могу изменить следующую команду для сжатого файла?

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

Команда работает нормально с обычным файлом. Мне нужно изменить команду для сжатых файлов.

    
задан AKR 30.10.2012 в 11:55
источник

3 ответа

20

Вам нужно прочитать их сжатые файлы, как это:

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
    
ответ дан Steve 30.10.2012 в 14:25
  • zcat эквивалентен gzip -dc (на некоторых системах он может быть gzcat) –  arekolek 30.06.2016 в 10:43
12
zcat FILE | awk '{ ...}'

Я бы не смог сказать, какой из всех этих методов работает лучше, zcat, по крайней мере, быстрее набрать;)

    
ответ дан runlevel0 26.05.2014 в 15:42
  • Вместо zcat я использовал gzcat - не совсем то же самое в ОС –  nevets1219 28.10.2015 в 21:45
6
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] }'

EDIT:

Для записи сжатого вывода просто добавьте

| bzip2 >output.vcf.bz2

или

| gzip >output.vcf.gz

Это будет работать с любой программой, которая печатает результаты в стандартный вывод.

Кстати: редактирование таких больших командных строк становится очень утомительным очень быстро. Вы должны написать небольшой сценарий оболочки, чтобы сделать эту работу. Это дает дополнительное преимущество, заключающееся в том, что вам не нужно запоминать все это и вы можете легко повторить команду или изменить ее при необходимости.

Хорошей отправной точкой для программирования оболочки Linux является Введение в программирование Bash Майка Дж.

    
ответ дан Mackie Messer 30.10.2012 в 11:57
  • Этот вывод будет в формате gz gzip -dc input1.vcf.gz input2.vcf.gz | awk 'FNR == NR {array [$ 1, $ 2] = $ 8; next} ($ 1, $ 2) в массиве {print $ 0 ";" array [$ 1, $ 2]} '> output.vcf.gz –  AKR 30.10.2012 в 12:24
  • @ user1782877: Попробуйте: команда | gzip> output.vcf.gz –  Steve 30.10.2012 в 12:34
  • @ user1782877 См. обновленный anser. –  Mackie Messer 30.10.2012 в 18:28