Я пытаюсь найти менее трудоемкий способ разделения файлов fastq по длине последовательности, т.е. разбить один большой файл fastq на несколько, содержащих только последовательности одинаковой длины. Ввод представляет собой обычный файл fastq (4 строки на последовательность, с фактической последовательностью во второй строке в каждом квартете) с различной длиной последовательности:
@HISEQ:28:H8P69ADXX:1:1101:1462:2036 1:N:0:CTTGTA
NCCATAAAGTAGAAAGCACT
+
#00<FFFFFFFFFIIFIIFF
@HISEQ:28:H8P69ADXX:1:1101:1419:2156 1:N:0:CTTGTA
TGGAGAGAAAGGCAGTTCCTGA
+
BBBFFFFFFFFFFIIIIIIIII
@HISEQ:28:H8P69ADXX:1:1101:1378:2223 1:N:0:CTTGTA
TCCTGTACTGAGCTGCCCCGA
+
BBBFFFFFFFFFFIIIIIIII
@HISEQ:28:H8P69ADXX:1:1101:1585:2081 1:N:0:CTTGTA
AAACCGTTACCATTACTGAGT
+
BBBFFFFFFFFFFIIIIFIII
Прямо сейчас я использую awk для фильтрации последовательностей определенной длины или в определенном диапазоне:
awk 'BEGIN {OFS = "\n"} {header = $0 ; getline seq ; getline qheader ; getline qseq ; if (length(seq) == 22) {print header, seq, qheader, qseq}}'
Если я хочу иметь выходной файл для каждой длины последовательности, я использую цикл for:
for i in {16..33};
awk -v var=$i 'BEGIN {OFS = "\n"} {header = $0 ; getline seq ; getline qheader ; getline qseq ; if (length(seq) == var) {print header, seq, qheader, qseq}}'
done
Проблема в том, что, хотя это работает нормально, это занимает довольно много времени, потому что я проверяю весь файл для каждой длины отдельно, я думаю. Кроме того, мне нужно заранее проверить самую длинную и самую короткую последовательность.
Может ли кто-нибудь помочь мне найти более эффективное решение, чем мой цикл? Если возможно, решение, в котором мне не нужно указывать диапазон, но тот, который проверяет минимальную и максимальную длину и автоматически разбивает их. Я хотел бы сделать это в awk, но я открыт для всего. Спасибо Бенедикт
NR%2==2
будет правдой. измените наNR%2==0
, который совпадает с!(NR%2)
, поэтому вы должны объединить два оператора с одним и тем же условием, очевидно, задав имя файла перед распечаткой. 18.04.2018