0

我想编辑一个排序的 Fastq 文件,并删除仅在某些字符位置重复的行。理想情况下,我会遍历输入文件中的每一行并输出一个文件,该文件只有一个任何唯一字符集的实例。

所以如下图。我只对查看每行的前 6 个字符、后 6 个字符和中间字符的一部分感兴趣,并且只保留三个序列的每个唯一组合的一个实例。

AAAAAACCCCCCCCCCCCTTTTTTTTTTCCCCCCCCAAAAAA    Start by comparing to this line
AAAAAACCCAAACCCCCCTTTTTTTTTTCCCCCCCCAAAAAA    1-6, 19-28, 37-42 are same, so delete
AAAAAACCCCCCCCCCCCTTTTTTTTTTCCCAAACCAAAAAA    1-6, 19-28, 37-42 are same, so delete
TTTTTTCCCCCCCCCCCCTTTTTTTTTTCCCCCCCCAAAAAA    1-6 and 36-42 are same but 37-42 are different so keep

如上例所示,如果我们取一个仅包含 4 行的文件,并且我正在查看字符 1-6、19-28、37-42,则第 2 行和第 3 行将被删除,或者不会输出到输出文件因为它们在每个所需位置都有相同的字符,但由于第 4 行不同,因此不会被删除。

我从下面的代码开始,我的想法是将每个位置设置为一个变量(但我不知道必须得到中间序列),然后在我们遍历输入文件时与每一行进行比较。

with open(current_file, 'r') as f:
    next(f)
    for line in f:
        start = line[:6]
        end = line[-7:]

如果有帮助,这些文件也是 5-10GB,所以不是很小。我将不胜感激任何帮助。谢谢。

4

2 回答 2

1

一种简单的方法是使用字典,其中的键由要比较的部分组成。每个新实例将简单地覆盖最后一个实例,您将保存唯一实例。对于您给出的示例:

a = 'AAAAAACCCCCCCCCCCCTTTTTTTTTTCCCCCCCCAAAAAA'    #Start by comparing to this line
b = 'AAAAAACCCAAACCCCCCTTTTTTTTTTCCCCCCCCAAAAAA'    #1-6, 19-28, 37-42 are same, so delete
c = 'AAAAAACCCCCCCCCCCCTTTTTTTTTTCCCAAACCAAAAAA'    #1-6, 19-28, 37-42 are same, so delete
d = 'TTTTTTCCCCCCCCCCCCTTTTTTTTTTCCCCCCCCAAAAAA'    #1-6 and 36-42 are same but 37-42 are different so keep
save_dict = {}
for fastq in (a,b,c,d):
    save_dict['%s%s%s' % (fastq[:6], fastq[19:28], fastq[37:42])] = fastq

最终包含 save_dict

{'AAAAAACTTTTTTTTTCAAAAA': 'AAAAAACCCCCCCCCCCCTTTTTTTTTTCCCAAACCAAAAAA',
 'TTTTTTCTTTTTTTTTCAAAAA': 'TTTTTTCCCCCCCCCCCCTTTTTTTTTTCCCCCCCCAAAAAA'}

(检查索引,我可能没有包括你所追求的)

于 2015-06-12T16:36:55.023 回答
1

这是一个执行以下操作的脚本:从每行中提取元素作为组合字符串,对照它已经看到的组合字符串列表检查它,如果它是一个新实例,则将该行添加到列表中。

with open('path/to/file', 'r') as f:
    lineCharsList = []
    outLines = []
    for line in f:
        lineChars = line[0:6]+line[18:28]+line[36:42]
        if not (lineChars in lineCharsList):
            lineCharsList.append(lineChars)
            outLines.append(line)
于 2015-06-12T16:37:12.333 回答