【问题标题】:Merge two lines generated from contigs.fa合并从 contigs.fa 生成的两行
【发布时间】:2012-12-21 10:42:59
【问题描述】:

我有一个由汇编程序生成的文件。如下所示。

>NODE_1_length_211_cov_22.379147
CATTTGCTGAAGAAAAATTACGAGAAATGGAGCACAAGGCTGTTTTTGTGAATGTCAAAC
CAAGTGACAACTCTATAGCGTTTGTATAAGACTCTCATACTAATCCCAAGCAAACTCTAT
ACTGACGCATGAACATGGAAGAGAAATGCTGCTCGTGTATGTATTATGGACCAGCTTGGA
ACACCATGTTAGGACTTTATAGATGTCTTACGATTTTTTCGACGTGATGAAGAAGTCTAT
TCAGCATTTGA
>NODE_2_length_85_cov_19.094118
TACTCCTGAGCACTTTGTGCTCTTAGTTCTTACTAGAACTGTTACAGCTCCACGAACTTG
TCGACTCTTTGAGTCAATTTCTGTTAGTTCCTACGAACTAAGAGGCTCTCTGAGCCCAGT
CTTCC

我想使用 python 或 linux sed 命令合并行,并希望以这种方式得到结果。

>NODE_1_length_211_cov_22.379147
CATTTGCTGAAGAAAAATTACGAGAAATGGAGCACAAGGCTGTTTTTGTGAATGTCAAACCAAGTGACAACTCTATAGCGTTTGTATAAGACTCTCATACTAATCCCAAGCAAACTCTATACTGACGCATGAACATGGAAGAGAAATGCTGCTCGTGTATGTATTATGGACCAGCTTGGAACACCATGTTAGGACTTTATAGATGTCTTACGATTTTTTCGACGTGATGAAGAAGTCTATTCAGCATTTGA
>NODE_2_length_85_cov_19.094118
TACTCCTGAGCACTTTGTGCTCTTAGTTCTTACTAGAACTGTTACAGCTCCACGAACTTGTCGACTCTTTGAGTCAATTTCTGTTAGTTCCTACGAACTAAGAGGCTCTCTGAGCCCAGTCTTCC

就像每个序列一样,将其视为单行,将节点名称视为另一行。

【问题讨论】:

  • 欢迎来到 Stack Overflow!看起来您希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只在发布者已经尝试自己解决问题时才提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出和您实际获得的输出(控制台输出、堆栈跟踪、编译器错误 - 不管是什么适用的)。您提供的详细信息越多,您可能收到的答案就越多。
  • @MartijnPieters 问号是错字,我认为> 是文件的一部分,对我来说看起来像FASTA
  • 是的,通过添加您迄今为止提出的代码来向我们展示一些爱。
  • 你可能不应该那样做。 FASTA 格式允许序列中的换行符。使用真实的现有 FASTA 解析器来读取文件(或开发一个用于练习)。另外,请使用edit 链接将格式正确的代码直接添加到您的问题中。
  • 请将示例代码添加到您的问题文本中,而不是作为评论。

标签: python linux sed awk fasta


【解决方案1】:

trsed 的小管道可以做到这一点:

$ tr -d '\n' < contigser.fa | sed 's/\(>[^.]\+\.[0-9]\+\)/\n\1\n/g' > newfile.fa 

python:

file = open('contigser.fa','r+')
lines= file.read().splitlines()

file.seek(0)
file.truncate()

for line in lines:
    if line.startswith('>'):
        file.write('\n'+line+'\n')
    else:
        file.write(line)

注意:python 解决方案将更改存储回contigser.fa

【讨论】:

  • 确定这不会在一行的输出中给出&gt;NODE_2_length_85_cov_19.094118TACTCCTGAGCACTTTGTGCTCTTAGTTCT ...
  • 但总的来说这个想法是好的 ;-) 我认为你需要包括一些尴尬。
  • @hochl 已修复,只需要让sed 抓住整行。
  • hochl 是对的..在大多数情况下,我得到它就像它正在与节点合并一样......我使用了 cat 函数..cat contigser.fa | tr -d '\n' > contigsers.fa ...它正在将所有内容转换为单行..我认为如果我将 \n 放在数字 cov_blah balh 之后可能会有所帮助
  • 你为什么做contigser.fa | tr -d '\n' &gt; contigsers.fa你错过了sed命令做contigser.fa | tr -d '\n' | sed 's/\(&gt;[^.]\+\.[0-9]\+\)/\n\1\n/g' &gt; contigsers.fa或者使用我添加的python解决方案。
【解决方案2】:

您可以使用awk 来完成这项工作:

awk < input_file '/^>/ {print ""; print; next} {printf "%s", $0} END {print ""}'

这只会启动一个进程 (awk)。唯一的缺点:它添加了一个空的第一行。你可以通过添加一个状态变量来避免这样的事情(代码属于一行,只是为了使它更好的可读性):

awk < input_file '/^>/ { if (flag) print ""; print; flag=0; next }
    { printf "%s", $0; flag=1 } END { if (flag) print "" }'

@如何将其存储在新文件中:

awk < input_file > output_file '/^>/ { .... }'

【讨论】:

  • printf 的概要是printf format,data。将其用作printf data 意味着data 被视为您的格式字符串,没有数据,因此如果您的输入包含 %s 或任何其他 printf 格式字符,则会严重混乱。你需要printf "%s",$0 而不是printf $0
【解决方案3】:
$ awk '/^>/{printf "%s%s\n",(NR>1?ORS:""),$0; next} {printf "%s",$0} END{print ""}' file
>NODE_1_length_211_cov_22.379147
CATTTGCTGAAGAAAAATTACGAGAAATGGAGCACAAGGCTGTTTTTGTGAATGTCAAACCAAGTGACAACTCTATAGCGTTTGTATAAGACTCTCATACTAATCCCAAGCAAACTCTATACTGACGCATGAACATGGAAGAGAAATGCTGCTCGTGTATGTATTATGGACCAGCTTGGAACACCATGTTAGGACTTTATAGATGTCTTACGATTTTTTCGACGTGATGAAGAAGTCTATTCAGCATTTGA
>NODE_2_length_85_cov_19.094118
TACTCCTGAGCACTTTGTGCTCTTAGTTCTTACTAGAACTGTTACAGCTCCACGAACTTGTCGACTCTTTGAGTCAATTTCTGTTAGTTCCTACGAACTAAGAGGCTCTCTGAGCCCAGTCTTCC

【讨论】:

    【解决方案4】:
    $ awk 'NR==1;ORS="";{sub(/>.*$/,"\n&\n");print (NR>1)?$0:""}END{print"\n"}' file
    >NODE_1_length_211_cov_22.379147
    CATTTGCTGAAGAAAAATTACGAGAAATGGAGCACAAGGCTGTTTTTGTGAATGTCAAACCAAGTGACAACTCTATAGCGTTTGTATAAGACTCTCATACTAATCCCAAGCAAACTCTATACTGACGCATGAACATGGAAGAGAAATGCTGCTCGTGTATGTATTATGGACCAGCTTGGAACACCATGTTAGGACTTTATAGATGTCTTACGATTTTTTCGACGTGATGAAGAAGTCTATTCAGCATTTGA
    >NODE_2_length_85_cov_19.094118
    TACTCCTGAGCACTTTGTGCTCTTAGTTCTTACTAGAACTGTTACAGCTCCACGAACTTGTCGACTCTTTGAGTCAATTTCTGTTAGTTCCTACGAACTAAGAGGCTCTCTGAGCCCAGTCTTCC
    

    【讨论】:

      【解决方案5】:

      这可能对你有用(GNU sed):

      sed '/^>/n;:a;$!N;s/\n\([^>]\)/\1/;ta;P;D' file
      

      在以&gt; 开头的行之后,删除除&gt; 符号之外的任何字符之前的所有换行符。

      【讨论】:

        猜你喜欢
        • 2021-07-13
        • 1970-01-01
        • 2016-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多