我想编辑一个测序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,所以不小。我将不胜感激任何帮助。感谢。
答案 0 :(得分: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'}
(检查索引,我可能没有包括你所追求的那些)
答案 1 :(得分: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)