Как использовать awk для сжатого файла
Как изменить следующую команду для сжатого файла?
awk 'FNR==NR { array[$1,$2]=$8; next } ($1,$2) in array { print $0 ";" array[$1,$2] }' input1.vcf input2.vcf
Команда работает нормально с обычным файлом. Мне нужно изменить команду для сжатых файлов.
Ответы
Ответ 1
Вам необходимо прочитать сжатые файлы следующим образом:
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
Ответ 2
zcat FILE | awk '{ ...}'
Я бы не смог определить, какой из этих методов работает лучше всего, zcat, по крайней мере, быстрее набирать;)
Ответ 3
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
Это будет работать с любой программой, которая выводит результаты на стандартный вывод.
BTW: Редактирование таких больших команд очень утомительно. Вы должны рассмотреть возможность написания небольшой оболочки script для выполнения задания. Это дает дополнительное преимущество, которое вам не нужно запоминать, и может легко повторить команду или при необходимости изменить ее.
Хорошей отправной точкой для программирования оболочки Linux является Bash Ввод в программирование Майком Г.