【问题标题】:Concatenate the sequence to the ID in fasta file将序列连接到fasta文件中的ID
【发布时间】:2019-06-10 22:36:36
【问题描述】:

这是我的输入文件

>OTU1;size=4;
ATTCCGGGTTTACT
ATTCCTTTTATCGA
ATC
>OTU2;size=10;
CGGATCTAGGCGAT
ACT
>OTU3;size=5;
ATTCCCGGGATCTA
ACTTTTC

预期的输出文件是:

>OTU1;size=4;ATTCCGGGTTTACTATTCCTTTTATCGAATC
>OTU2;size=10;CGGATCTAGGCGATACT
>OTU3;size=5;ATTCCCGGGATCTAACTTTTC

我试过Remove line breaks in a FASTA file的代码

但这对我不起作用,我不确定如何修改该帖子中的代码... 有什么建议吗?提前致谢!

【问题讨论】:

  • 我看到你已经问了 5 个问题,但没有接受任何一个问题的答案。请参阅stackoverflow.com/help/someone-answers 了解当你得到答案时该怎么做。此外,this doesn't work 是对任何问题的最糟糕的描述,因为它绝对没有给我们任何继续尝试帮助您的机会。如果某件事“不起作用”,请告诉我们它以何种方式“不起作用”(例如错误输出、无输出、错误消息、核心转储等)以获得帮助。

标签: awk


【解决方案1】:

这是另一个awk 脚本。使用awk内部解析机制。

awk 'BEGIN{RS=">";OFS="";}NR>1{$1=$1;print ">"$0}' input.txt

输出是:

>OTU1;size=4;ATTCCGGGTTTACTATTCCTTTTATCGAATC
>OTU2;size=10;CGGATCTAGGCGATACT
>OTU3;size=5;ATTCCCGGGATCTAACTTTTC

解释:

awk '
BEGIN {        # initialize awk internal variables
  RS=">";      # set `RS`=record separator to `>`
  OFS="";      # set `OFS`=output field separator to empty string.
}
NR>1 {         # handle from 2nd record (1st record is empty).
  $1=$1;       # regenerate the output line
  print ">"$0  # print out ">" with computed output line
}' input.txt

【讨论】:

  • 内部变量的使用非常好。
  • 您仍然需要设置FS="\n"。此外,假设您想处理两个文件,使用FNR>1 而不是NR>1 可能更明智。
  • 感谢您的评论,我检查了 FS 的默认默认值为 \n 并且无法覆盖它(希望我理解正确)。见这里math.utah.edu/docs/info/gawk_6.html#SEC45
  • FS 默认为空格或换行符是正确的,但您不能覆盖换行符是错误的。当FS 是两个字符时,假设它是一个正则表达式,然后你将换行符覆盖为字段拆分器。 (见POSIX awk standard部分正则表达式)
  • 好吧,原来我以前偶然发现过这个,请参阅lists.gnu.org/archive/html/bug-gawk/2019-04/msg00029.html,gawk 维护人员将更新 gawk 文档以记录差异并努力更改 POSIX 标准,因此它描述了gawk(和其他一些 awks)的行为方式是仅在 FS 是单个字符时将 \n 添加到 FS 但如果 FS 是正则表达式,则不要将 \n 添加到它。当然,所有这些仍然只适用于RS 为空的情况。
【解决方案2】:
$ awk '{printf "%s%s", (/^>/ ? ors : ""), $0; ors=ORS} END{print ""}' file
>OTU1;size=4;ATTCCGGGTTTACTATTCCTTTTATCGAATC
>OTU2;size=10;CGGATCTAGGCGATACT
>OTU3;size=5;ATTCCCGGGATCTAACTTTTC

【讨论】:

  • 智能、简洁、优雅的解决方案。请解释ors 变量的必要性。谢谢
  • 谢谢。您需要为第一行打印 null ,然后为 ORS 打印,以便在处理第一行后设置该变量来解决这个问题。这相当于写(/^>/ ? (NR>1 > ORS : "") : ""), $0,我认为它更神秘。
【解决方案3】:

您也可以尝试一下吗?

awk -v RS=">" 'NR>1{gsub(/\n/,"");print ">"$0}'  Input_file

我最初的尝试是awk -v RS=">" -v FS="\n" -v OFS="" 'NF>1{$1=$1;print ">"$0}' Input_file,但后来我看到它已经回答了buy dudi boy所以写了另一个(第一次提到的)一个。

【讨论】:

  • 我认为你这里有错误。不应该是(NR>1)吗?
  • 智能、简洁、优雅的解决方案。
  • @kvantour,谢谢先生告知,现在编辑。
【解决方案4】:

类似于我的回答here

$ awk 'BEGIN{RS=">"; FS="\n"; ORS=""}
       (FNR==1){next}
       { name=$1; seq=$0; gsub(/(^[^\n]*|)\n/,"",seq) }
       { print ">" name seq }' file1.fasta file2.fasta file3.fasta ...

【讨论】:

    猜你喜欢
    • 2018-10-23
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    相关资源
    最近更新 更多