2017-10-09 55 views
1

有人能帮助我想出一个策略编辑我的FASTA文件,该文件有下列格式追加文本到FASTA登录号(使用bash?)

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脚本来完成,但我是新来这个,真的希望任何帮助。

回答

1

您当然可以用awk来做,但您可以使用sed(例如,

$ sed 's/\(^[^|]*|\)\([^|]*\)\(.*$\)/\1\2_RESERVED\3/' 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 

基本上使用的是3个反向引用在正常替代语法的匹配部分(例如\(...\)之间捕获的字符的那些基团),例如

sed 's/match/replace/' 

在你的情况,本场比赛是由我们要拍摄的第一回参考:

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

将被替换放回replace\1(第一回参考)。接下来,我们同样收集登录号有:

\([^|]*\)  # which just captures everything up to the next '|' 

它将在replace插入为\2_RESERVED插入"accession number + _RESERVED"你需要。最后,我们只是收集一切在其他行有:

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

把全replace在一起\1\2_RESERVED\3

猛砸解决方案

如果你需要这样做在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 

查看所有解决方案,并让我知道你是否有任何问题。

1

正则表达式解决方案可能是有效的,但很难理解。 awk中的一个整洁的东西是它自然将输入分割为字段,并在输出它们之前将这些字段分开。我发现比正则表达式更容易打字/记忆。

$ awk 'BEGIN {FS="|";OFS="|"} {$2=$2 "_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