2017-10-09 54 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