将文本附加到 FASTA 登录号(使用 bash?)

Appending text to a FASTA accession number (using bash?)

谁能帮我想出一个策略来编辑我的 FASTA 文件,该文件包含以下格式的条目

sp|Q9NYW0|T2R10_HUMAN Taste receptor type 2 member 10 OS=Homo sapiens 
sp|Q9NYV9|T2R13_HUMAN Taste receptor type 2 member 13 OS=Homo sapiens

对于这些行中的每一行,我都需要将文本“_REVERSED”附加到 || 之间的登录号。例如,上面的条目将变为:

sp|Q9NYW0_REVERSED|T2R10_HUMAN Taste receptor type 2 member 10 OS=Homo sapiens 
sp|Q9NYV9_REVERSED|T2R13_HUMAN Taste receptor type 2 member 13 OS=Homo sapiens

我知道这是一个简单的问题,并且认为可以使用示例 bash 脚本来完成,但我是新手,非常感谢任何帮助。

你当然可以用 awk 做到这一点,但你也可以用 sed 同样容易地做到这一点,例如

$ sed 's/\(^[^|]*|\)\([^|]*\)\(.*$\)/_RESERVED/' yourfile
sp|Q9NYW0_RESERVED|T2R10_HUMAN Taste receptor type 2 member 10 OS=Homo sapiens
sp|Q9NYV9_RESERVED|T2R13_HUMAN Taste receptor type 2 member 13 OS=Homo sapiens

本质上,您在 substitute[的匹配部分使用了 3 back references(例如,在 \(...\) 之间捕获的那些字符组) =52=] 语法,例如

sed 's/match/replace/'

在您的情况下,匹配由我们希望捕获的第一个反向引用组成:

\(^[^|]*|\)   # match from beginning '^' everything not '|', with the '|'

将被替换为 replace 中的 </code>(第一个反向引用)。接下来,我们类似地收集 <em> 登录号 </em> 与:</p> <pre><code>\([^|]*\) # which just captures everything up to the next '|'

它将作为 _RESERVED 插入到 replace 中插入您需要的 "accession number + _RESERVED"。最后,我们只收集了符合以下内容的所有其他内容:

\(.*$\)       # which just says grab everything that remains '.*$'

将完整的 replace 放在一起作为 _RESERVED

Bash 解决方案

如果您需要在 bash 中执行此操作,那么使用 IFS内部字段分隔符)设置为 '|' 拆分字段和一个简单的 read 循环。例如:

$ while IFS=$'|' read a b c; do echo "${a}|${b}_RESERVED|${c}"; done <yourfile
sp|Q9NYW0_RESERVED|T2R10_HUMAN Taste receptor type 2 member 10 OS=Homo sapiens
sp|Q9NYV9_RESERVED|T2R13_HUMAN Taste receptor type 2 member 13 OS=Homo sapiens

查看所有解决方案,如果您有任何问题,请告诉我。

正则表达式解决方案可能很有效,但难以理解。 awk 中的一件巧妙的事情是它自然地将输入分成字段,并 you can manipulate 这些字段在输出它们之前。我发现这比正则表达式方法更容易 type/remember。

$ awk 'BEGIN {FS="|";OFS="|"} {= "_REVERSED"}{print}' < t
sp|Q9NYW0_REVERSED|T2R10_HUMAN Taste receptor type 2 member 10 OS=Homo sapiens
sp|Q9NYV9_REVERSED|T2R13_HUMAN Taste receptor type 2 member 13 OS=Homo sapiens