我生成的序列文件如下:
>rpl-7
ATGGCTCCAAC
>rpl-7
AAGAAAGTGCCACAGGTTCCAGAAAC
>rpl-8
AAGAACAAGGAGAAGAAGACCCAATACTTCAAGCGTGC
>rpl-8
GCTCTCCAGATCCTCCGTCTTCGTCAGATCAA
>rpl-8
AAGTTCAACATCATCTGTCTTGAGGA我想合并相同ID的序列,就像这样:
>rpl-7
ATGGCTCCAAC
AAGAAAGTGCCACAGGTTCCAGAAAC
>rpl-8
AAGAACAAGGAGAAGAAGACCCAATACTTCAAGCGTGC
GCTCTCCAGATCCTCCGTCTTCGTCAGATCAA
AAGTTCAACATCATCTGTCTTGAGGA我使用python判断以‘>’开头的字符串是否相同,如果它们是相同的,则继续增加序列.但是,这种方法不能输出第一个ID.In添加,我认为使用 awk 会更容易,不幸的是我不熟悉awk。你知道怎么做吗?谢谢。
发布于 2020-08-30 10:38:13
循环输入文件,分组到以rpl-id为键的字典,并将这些值附加到列表中:
rpl_dict = {}
with open('rpl_input.txt') as rpl_input_file:
lines = rpl_input_file.readlines()
for line in lines:
# Fetching current `rpl-id`
if line.startswith('>rpl'):
rpl_key = line.strip()
# Fetching current `rpl-value`
else:
rpl_value = line.strip()
# Appending current `rpl-value`
if rpl_key not in rpl_dict.keys():
rpl_dict[rpl_key] = []
rpl_dict[rpl_key].append(rpl_value)
# {'>rpl-7': ['ATGGCTCCAAC', 'AAGAAAGTGCCACAGGTTCCAGAAAC'], '>rpl-8': ['AAGAACAAGGAGAAGAAGACCCAATACTTCAAGCGTGC', 'GCTCTCCAGATCCTCCGTCTTCGTCAGATCAA', 'AAGTTCAACATCATCTGTCTTGAGGA']}
print(rpl_dict)
with open('rpl_output.txt', 'w') as rpl_output_file:
for rpl_id, rpl_values in rpl_dict.items():
rpl_output_file.write(f'{rpl_key}\n')
for v in rpl_values:
rpl_output_file.write(f'{v}\n')输出文件:
>rpl-8
ATGGCTCCAAC
AAGAAAGTGCCACAGGTTCCAGAAAC
>rpl-8
AAGAACAAGGAGAAGAAGACCCAATACTTCAAGCGTGC
GCTCTCCAGATCCTCCGTCTTCGTCAGATCAA
AAGTTCAACATCATCTGTCTTGAGGA发布于 2020-08-30 10:46:38
你可以用regex来做这件事。由于您提到了文件,我添加了新的行字符,您可以用文件的内容替换它。
import re
regex = r'rpl-\d\n.*(?:$|\n)'
dic = {}
test_str = (">rpl-7\n"
"ATGGCTCCAAC\n"
">rpl-7\n"
"AAGAAAGTGCCACAGGTTCCAGAAAC\n"
">rpl-8\n"
"AAGAACAAGGAGAAGAAGACCCAATACTTCAAGCGTGC\n"
">rpl-8\n"
"GCTCTCCAGATCCTCCGTCTTCGTCAGATCAA\n"
">rpl-8\n"
"AAGTTCAACATCATCTGTCTTGAGGA\n")
matches = re.finditer(regex, test_str, re.MULTILINE)
for match in matches:
rpl,pro = match.group().split('\n')
if rpl in dic:
dic[rpl] = dic[rpl]+pro
else:
dic[rpl] = pro输出:
{'rpl-7': 'ATGGCTCCAACAAGAAAGTGCCACAGGTTCCAGAAAC',
'rpl-8': 'AAGAACAAGGAGAAGAAGACCCAATACTTCAAGCGTGCGCTCTCCAGATCCTCCGTCTTCGTCAGATCAAAAGTTCAACATCATCTGTCTTGAGGA'}发布于 2020-08-30 11:10:43
这是另一个解决办法,
input_ = """>rpl-7
ATGGCTCCAAC
>rpl-7
AAGAAAGTGCCACAGGTTCCAGAAAC
>rpl-8
AAGAACAAGGAGAAGAAGACCCAATACTTCAAGCGTGC
>rpl-8
GCTCTCCAGATCCTCCGTCTTCGTCAGATCAA
>rpl-8
AAGTTCAACATCATCTGTCTTGAGGA"""
results = {}
lines = input_.splitlines()
for i, j in zip(lines[::2], lines[1::2]):
results.setdefault(i, []).append(j)
for i, j in results.items():
print(i)
print("\n".join(j))>rpl-7
ATGGCTCCAAC
AAGAAAGTGCCACAGGTTCCAGAAAC
>rpl-8
AAGAACAAGGAGAAGAAGACCCAATACTTCAAGCGTGC
GCTCTCCAGATCCTCCGTCTTCGTCAGATCAA
AAGTTCAACATCATCTGTCTTGAGGAhttps://stackoverflow.com/questions/63656418
复制相似问题