【发布时间】:2018-04-11 14:19:17
【问题描述】:
我正在尝试找到一种更省时的方法来按序列长度分割 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 中做,但我对一切都开放。 谢谢 本尼迪克特
【问题讨论】:
-
不幸的是,我的问题有点不同。我想根据某些标准(序列长度)拆分我的 fastq 文件,而不仅仅是分成一定数量的文件。如果按长度拆分,您最终会得到大小差异很大的文件,因为一些序列长度很少,而另一些则非常丰富。但是感谢您抽出宝贵的时间!