从排序Fastq文件中删除很少发生的行

时间:2015-05-28 22:38:33

标签: bash awk fastq

我有一个文本文件,其中包含4行长组中的实验数据。我想删除那些罕见的数据点。所以下面是前8行文件格式,这会重复数千行(文件中不存在行号):

1 Info_1
2 Sequence_1
3 Info_1
4 Info_1
5 Info_2
6 Sequence_2
7 Info_2
8 Info_2
9 Info_3
10 Sequence_3
11 Info_3
12 Info_3

因此,第1-4行包含序列1的信息,第5-8行包含序列2的信息,序列3的信息包含9-12 ......依此类推。在某些情况下,通常会删除包含完全唯一或发现次数少于3次的序列的任意四行。

我想要做的是将第2行与第6,10,14,18行比较......如果发现大于3次,则不执行任何操作。如果发现3次或更少,则删除第1-4行和包含匹配序列的每组4行。然后对文件中的每一行进行相同的比较。

因此,如果在上面的文件中,序列1和序列3匹配,并且因为该序列仅被重复< 3次,删除每组四行,生成的文件应如下所示:

1 Info_2
2 Sequence_2
3 Info_2
4 Info_2

以下是我的开始:

awk 'FNR==NR {
    if (FNR%4==2) {
    a[$1]++
    if (a[$1]<3) b[int(FNR/4)]=1
    }
    next}
b[int(FNR/4)]==0' inputFile inputFile > outputFile

但这并不会删除发现次数少于三次的所有行。我将不胜感激任何帮助。感谢。

这是一个真实的可测试示例: 输入:

Info1
AAGC
Info1
Info1
Info2
AACT
Info2
Info2
Info3
AAGC
Info3
Info3
Info4
AAGC
Info4
Info4
Info5
AACT
Info5
Info5

由于AAGC出现>= 3次,但AACT出现<3次,输出应为:

Info1
AAGC
Info1
Info1
Info3
AAGC
Info3
Info3
Info4
AAGC
Info4
Info4

希望这有助于澄清。

3 个答案:

答案 0 :(得分:2)

对于这个问题,最好使用高级编程语言和专门的生物信息库,我使用python和biopython

from Bio import SeqIO

input_file = open("input.fastq")

#to store sequence in dictionary using dna sequences as keys
#it consume RAM (if fastq is very very large, it could be a problem)
dict_seq = {}
for seq in SeqIO.parse(input_file, "fastq"):
  if not str(seq.seq) in dict_seq:
    dict_seq[str(seq.seq)] = []
  dict_seq[str(seq.seq)].append(seq)

#filter sequences
list_filter = [ dna for dna in dict_seq.keys() if len(dict_seq[dna]) >= 3]

#print output in fastq format
output_file = open("filter.fastq", "w")
for dna in list_filter:
  for seq in dict_seq[dna]:
    output_file.write(seq.format("fastq"))

output_file.close()

input.fastq

@EAS54_6_R1_2_1_413_324
CCCTTCTTGTCTTCAGCGTTTCTCC
+
;;3;;;;;;;;;;;;7;;;;;;;88
@EAS54_6_R1_2_1_540_792
TTGGCAGGCCAAGGCCGATGGATCA
+
;;;;;;;;;;;7;;;;;-;;;3;83
@EAS54_6_R1_2_1_443_348
GTTGCTTCTGGCGTGGGTGGGGGGG
+EAS54_6_R1_2_1_443_348
;;;;;;;;;;;9;7;;.7;393333
@EAS54_6_R1_2_1_413_789
CCCTTCTTGTCTTCAGCGTTTCTCC
+
;;3;;;;;;;;;;;;7;;;;;;;88
@EAS54_6_R1_2_1_413_329
CCCTTCTTGTCTTCAGCGTTTCTCC
+
;;3;;;;;;;;;;;;7;;;;;;;88

filter.fastq

@EAS54_6_R1_2_1_413_324
CCCTTCTTGTCTTCAGCGTTTCTCC
+
;;3;;;;;;;;;;;;7;;;;;;;88
@EAS54_6_R1_2_1_413_789
CCCTTCTTGTCTTCAGCGTTTCTCC
+
;;3;;;;;;;;;;;;7;;;;;;;88
@EAS54_6_R1_2_1_413_329
CCCTTCTTGTCTTCAGCGTTTCTCC
+
;;3;;;;;;;;;;;;7;;;;;;;88

答案 1 :(得分:2)

扩展您的脚本:

$ awk '
    (NR==FNR){ # First pass, record the count.
        if(FNR%4==2){a[$1]++}
        next;
    }

    (FNR%4){ # remember the group of 4 lines.
        r[FNR%4]=$0;
        next;
    }

    { # On every 4th line, check if the count is >= 3 & print the entire 4 line group.
        if (a[r[2]] >= 3) print r[1] "\n" r[2] "\n" r[3] "\n" $0 
    }' inputFile inputFile

答案 2 :(得分:1)

Sync Project with Gradle Files