将文本附加到 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
谁能帮我想出一个策略来编辑我的 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