首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ID行后面加上值行的文件中按ID对行进行分组?

如何在ID行后面加上值行的文件中按ID对行进行分组?
EN

Stack Overflow用户
提问于 2020-08-30 10:23:03
回答 3查看 88关注 0票数 0

我生成的序列文件如下:

代码语言:javascript
复制
>rpl-7
ATGGCTCCAAC
>rpl-7
AAGAAAGTGCCACAGGTTCCAGAAAC
>rpl-8
AAGAACAAGGAGAAGAAGACCCAATACTTCAAGCGTGC
>rpl-8
GCTCTCCAGATCCTCCGTCTTCGTCAGATCAA
>rpl-8
AAGTTCAACATCATCTGTCTTGAGGA

我想合并相同ID的序列,就像这样:

代码语言:javascript
复制
>rpl-7
ATGGCTCCAAC
AAGAAAGTGCCACAGGTTCCAGAAAC
>rpl-8
AAGAACAAGGAGAAGAAGACCCAATACTTCAAGCGTGC
GCTCTCCAGATCCTCCGTCTTCGTCAGATCAA
AAGTTCAACATCATCTGTCTTGAGGA

我使用python判断以‘>’开头的字符串是否相同,如果它们是相同的,则继续增加序列.但是,这种方法不能输出第一个ID.In添加,我认为使用 awk 会更容易,不幸的是我不熟悉awk。你知道怎么做吗?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-30 10:38:13

循环输入文件,分组到以rpl-id为键的字典,并将这些值附加到列表中:

代码语言:javascript
复制
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')

输出文件:

代码语言:javascript
复制
>rpl-8
ATGGCTCCAAC
AAGAAAGTGCCACAGGTTCCAGAAAC
>rpl-8
AAGAACAAGGAGAAGAAGACCCAATACTTCAAGCGTGC
GCTCTCCAGATCCTCCGTCTTCGTCAGATCAA
AAGTTCAACATCATCTGTCTTGAGGA
票数 0
EN

Stack Overflow用户

发布于 2020-08-30 10:46:38

你可以用regex来做这件事。由于您提到了文件,我添加了新的行字符,您可以用文件的内容替换它。

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
{'rpl-7': 'ATGGCTCCAACAAGAAAGTGCCACAGGTTCCAGAAAC',
 'rpl-8': 'AAGAACAAGGAGAAGAAGACCCAATACTTCAAGCGTGCGCTCTCCAGATCCTCCGTCTTCGTCAGATCAAAAGTTCAACATCATCTGTCTTGAGGA'}
票数 0
EN

Stack Overflow用户

发布于 2020-08-30 11:10:43

这是另一个解决办法,

代码语言:javascript
复制
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))

代码语言:javascript
复制
>rpl-7
ATGGCTCCAAC
AAGAAAGTGCCACAGGTTCCAGAAAC
>rpl-8
AAGAACAAGGAGAAGAAGACCCAATACTTCAAGCGTGC
GCTCTCCAGATCCTCCGTCTTCGTCAGATCAA
AAGTTCAACATCATCTGTCTTGAGGA
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63656418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档