awk для многих сжатых файлов - PullRequest
0 голосов
/ 24 октября 2019

Следующая команда вычисляет содержание GC для каждого fasta fastq файлов , идентифицированных командой find. Вкратце, fastq - это файл, который для большого количества точек данных содержит 4 строки информации и содержит только интересующую меня вторую строку (ATGC). Для тестирования (идентичных) файлов примеров можно найти здесь ).

find . -iname '*.fastq' -exec awk '(NR%4==2) {N1+=length($0);gsub(/[AT]/,"");N2+=length($0);}END{print N2/N1;}' "{}" \;

Как я могу изменить / переписать его в однострочник, который работает с файлами gziped fastq? Мне нужна опция регулярного выражения, используемая в данный момент с find.

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Если, как вы говорите, у вас много больших файлов, я бы предложил обрабатывать их параллельно. Если проблема в том, что у вас проблемы с цитированием awk, я бы предложил поместить ваш скрипт в отдельный файл, который называется, скажем, script.awk, например:

(NR%4==2) {N1+=length($0);gsub(/[AT]/,"");N2+=length($0);}END{print N2/N1;}

Теперь вы можете просто обработать ихвсе параллельно с GNU Parallel :

find . -iname \*fastq.gz -print0 | parallel -0 gzcat {} \| awk -f ./script.awk
1 голос
/ 24 октября 2019

find '-exec' может использоваться для вызова (и передачи аргументов) одной программе. Сложность заключается в том, что две команды (cat | awk) необходимо объединить с конвейером. Два возможных пути: создать команду оболочки ИЛИ использовать более гибкие xargs.

# Using the 'shell -c' command
find . -iname '*.fastq.gz' -exec sh -c "zcat {} | awk '(NR%4==2) \
{N1+=length(\$0);gsub(/[AT]/,\"\");N2+=length(\$0);}END{print N2/N1;}'" \;

# OR, using process substitution
find . -iname '*.fastq.gz' -exec bash -c "awk '(NR%4==2) \
{N1+=length(\$0);gsub(/[AT]/,\"\");N2+=length(\$0);}END{print N2/N1;}' <(zcat {})" \;

См. Много ссылок, чтобы найти / xargs в переполнении стека

...