2017-02-25 24 views
2

我有一個包含數千個蛋白質序列的文件,格式如下;在特定模式後添加換行符

 
>EgrG_000615900transcript=EgrG_000615900gene=EgrG_000615900MAIRSFGRIAPARSLLIHFKLVTDAFHGEAPSGPYLLPQAARSLLCEKCDGKCVICDSYVRPCTLVRICDECNYGSYQGRCVICGGTGVSDAYYCRESPKPTSFTKGRNMDSKNDLISNKFTMHADVIISILKPGLFVIVDFFIV 

每種蛋白質目前都在自己的生產線上。 'MAIRS ... FFIV'代表蛋白質序列和它加入之前的東西。我希望蛋白質在一條新的線上,也就是說我希望在那裏有'.... EgrG_000615900'(這裏的數字有所不同,但總是有9位數字)和'MAIRS ....'之間有一個換行符。 。理想情況下,輸出看起來像這樣;

 
>EgrG_000615900transcript=EgrG_000615900gene=EgrG_000615900 
MAIRSFGRIAPARSLLIHFKLVTDAFHGEAPSGPYLLPQAARSLLCEKCDGKCVICDSYVRPCTLVRICDECNYGSYQGRCVICGGTGVSDAYYCRESPKPTSFTKGRNMDSKNDLISNKFTMHADVIISILKPGLFVIVDFFIV 

文件中的每個蛋白質都以>EgrG_.........transcript=EgrG_.........gene=EgrG_.........(代表任何數字0-9的點)開頭。

我已經試過

sed 's/>EgrG_.........transcript=EgrG_.........gene=EgrG_........./&\n/g' input file > output file 

但這不起作用

UPDATE 謝謝大家的關注。事後看來,我覺得我可以簡化我的請求。以下是我的文件中的一個更大的示例;

 
>EgrG_000615900 transcript=EgrG_000615900 gene=EgrG_000615900MAIRSFGRIAPARSLLIHFKLVTDAFHGEAPSGPYLLPQAARSLLCEKCDGKCVICDSYVRPCTLVRICDECNYGSYQGRCVICGGTGVSDAYYCRESPKPTSFTKGRNMDSKNDLISNKFTMHADVIISILKPGLFVIVDFFIV 
>EgrG_001057700 transcript=EgrG_001057700 gene=EgrG_001057700MEESNSEPVIFQVSKLAGRHNYTSFGHKEDLDPQNKFSIPSPADHPGKHRSVLRSLFKGMSSGGKNVALEEQQPTYRQAGSSSHHRYHIHHYPHNPSDDRRPLRGPCFPHMSSSSQSASAFSSPNSSSSPGQRVSTFHAGLREEVLEQDGTSSTTQANFSEEPLVLLVLFPASKSKEAVLPLTTVGRNDCCATASVFTLRLASTYCDVAFFINYFS 
>EgrG_000972800 transcript=EgrG_000972800 gene=EgrG_000972800MTSYCAVFMVPLLTLLILWGHLPACESTPLPSELIVRRGRTLQDLYRYVQQQYLMCLKCPNCPCETKFNIRRRSGGINWPQYMNASGMTAKNMEEALDDY 
>EgrG_000198800 transcript=EgrG_000198800 gene=EgrG_000198800MPETGKSGGTTISSKTKSTAVSSGTPVKPMKSESCRLISGESPTSVVILKPAWASFVTPFPPVQEKCCKCGQLVRFSDRIELLGKVFHESCFRCAVCNRPLSNSEAIFHSNAWNCEAHASSYPRLYAS` 

雖然它不會出現在這裏,我的文件中,這四個序列都在同一行。雖然加入的數字在單個蛋白質上發生變化,但字符數保持不變(因此可以表示登錄號; >EgrG_......... transcript=EgrG_......... gene=EgrG_.........)。您可能會注意到,每種情況下的實際蛋白質序列都以'M'開始。這些是我文件中所有蛋白質/線條的唯一一致性。目前,我的文件由單一行上的登錄號和蛋白質序列組成,但是我想要對上述序列進行格式化;

 
>EgrG_000615900 transcript=EgrG_000615900 gene=EgrG_000615900 
MAIRSFGRIAPARSLLIHFKLVTDAFHGEAPSGPYLLPQAARSLLCEKCDGKCVICDSYVRPCTLVRICDECNYGSYQGRCVICGGTGVSDAYYCRESPKPTSFTKGRNMDSKNDLISNKFTMHADVIISILKPGLFVIVDFFIV` 
>EgrG_001057700 transcript=EgrG_001057700 gene=EgrG_001057700 
MEESNSEPVIFQVSKLAGRHNYTSFGHKEDLDPQNKFSIPSPADHPGKHRSVLRSLFKGMSSGGKNVALEEQQPTYRQAGSSSHHRYHIHHYPHNPSDDRRPLRGPCFPHMSSSSQSASAFSSPNSSSSPGQRVSTFHAGLREEVLEQDGTSSTTQANFSEEPLVLLVLFPASKSKEAVLPLTTVGRNDCCATASVFTLRLASTYCDVAFFINYFS` 
>EgrG_000972800 transcript=EgrG_000972800 gene=EgrG_000972800 
MTSYCAVFMVPLLTLLILWGHLPACESTPLPSELIVRRGRTLQDLYRYVQQQYLMCLKCPNCPCETKFNIRRRSGGINWPQYMNASGMTAKNMEEALDDY 
>EgrG_000198800 transcript=EgrG_000198800 gene=EgrG_000198800 
MPETGKSGGTTISSKTKSTAVSSGTPVKPMKSESCRLISGESPTSVVILKPAWASFVTPFPPVQEKCCKCGQLVRFSDRIELLGKVFHESCFRCAVCNRPLSNSEAIFHSNAWNCEAHASSYPRLYAS` 

即在一行上的登錄,下一個的蛋白質序列。總而言之,在

 
>EgrG_......... transcript=EgrG_......... gene=EgrG_......... 

之間劃分的線和第一'M'是所需要的。

再次感謝您對您的耐心

+0

有該文件的其他行其他類型? – thanasisp

回答

2

可以使用二十種氨基酸名單中,提取蛋白質序列(IUPAC符號,不含終止密碼子符號)

 
alanine - A 
arginine - R 
asparagine - N 
aspartic acid - D 
cysteine - C 
glutamine - Q 
glutamic acid - E 
glycine - G 
histidine - H 
isoleucine - I 
leucine - L 
lysine - K 
methionine - M 
phenylalanine - F 
proline - P 
serine - S 
threonine - T 
tryptophan - W 
tyrosine - Y 
valine - V 

special cases: 

asparagine/aspartic acid - B 
glutamine/glutamic acid - Z 

隨着gnu-sed

sed -r 's/[ARNDCQEGHILKMFPSTWYVBZ]+$/\n&/' file 

隨着sed

sed 's/[ARNDCQEGHILKMFPSTWYVBZ]*$/\'$'\n&/g' file 

你,相應fasta格式,

 
>EgrG_000615900transcript=EgrG_000615900gene=EgrG_000615900 
MAIRSFGRIAPARSLLIHFKLVTDAFHGEAPSGPYLLPQAARSLLCEKCDGKCVICDSYVRPCTLVRICDECNYGSYQGRCVICGGTGVSDAYYCRESPKPTSFTKGRNMDSKNDLISNKFTMHADVIISILKPGLFVIVDFFIV 
+0

你好,何塞,使用你的命令,我得到這個返回;'sed:非法選項 - r 用法:sed腳本[-Ealn] [-i擴展名] [文件...] sed [-Ealn] [-i擴展名] [-e腳本] ... [-f script_file] ... [文件。 ..]' – DKaplinski

+0

使用'sed's/[ARNDCQEGHILKMFPSTWYVBZ] * $/\ n&/'file'代替.....您使用'gnu-sed' –

+0

這會返回一個'n',換行符需要是; '> EgrG_000615900成績單= EgrG_000615900基因= EgrG_000615900nMAIRSFGRIAPARSLLIHFKLVTDAFHGEAPSGPYLLPQAARSL​​LCEKCDGKCVICDSYVRPCTLVRICDECNYGSYQGRCVICGGTGVSDAYYCRESPKPTSFTKGRNMDSKNDLISNKFTMHADVIISILKPGLFVIVDFFIV' – DKaplinski

0

@DKaplinski:嘗試:

awk --re-interval '{match($0,/.*EgrG_[0-9]{9}MAIRS/);print substr($0,RSTART,RLENGTH-5);sub(/.*EgrG_[0-9]{9}MAIRS/,"");print "MAIRS" $0}' Input_file 

以上將分EgrG_till 9位數字,並用一行直至EgrG_該行的其餘MARIS,然後用MARIS的其餘部分線。讓我知道這是否有助於你。

+1

默認情況下,在GNU awk中重啓時間間隔已經啓用好幾年了,所以擺脫'--re-interval'(或者得到一個新的awk!)。 –

+1

謝謝埃德莫頓,是的,我有GNU Awk 3.1.7,但有些如何不採用這個正則表達式直到/除非我把--re-interval。 另外我有一個問題(如果你不介意),我試圖通過把正則表達式像gsub(/ EgrG_ [0-9] {9} [^(MAIRS)],但我知道它是在這裏,我怎麼能在這裏使用一個字,而不是字符,你可以請幫助在相同的。 – RavinderSingh13

+2

這是一個侏羅紀版本的gawk,超過5年過時,得到一個現代的!爲了否定一個字/字符串robustly你必須創建一個不存在於輸入中的字符,將該字映射到該字符,然後否定該字符,然後將該字符轉換回該字,例如'(gsub(/ @ /,「@ A」) ; gsub(/ X /,「@ B」); gsub(/ MAIRS /,「X」); gsub(/...[^ X] .. /,...); gsub(/ X /,「 MAIRS「); gsub(/ @ B /,」X「); gsub(/ @ A /,」@「)'想一想,並添加打印語句來看看它是如何穩健運行的,併發佈一個問題, –

1
$ sed 's/M/\ 
&/' file 
EgrG_000615900transcript=EgrG_000615900gene=EgrG_000615900 
MAIRSFGRIAPARSLLIHFKLVTDAFHGEAPSGPYLLPQAARSLLCEKCDGKCVICDSYVRPCTLVRICDECNYGSYQGRCVICGGTGVSDAYYCRESPKPTSFTKGRNMDSKNDLISNKFTMHADVIISILKPGLFVIVDFFIV 
FIV 

如果這不是你需要的,那麼更新你的問題來展示一些更真實有代表性的樣本輸入和期望的輸出。

1

sed另一個

sed -r 's/(^>(.+)transcript=\2gene=\2)/\1\n/' file 

尋找一個圖案>{KEY}transcript={KEY}gene={KEY}並插入新行。

>EgrG_000615900transcript=EgrG_000615900gene=EgrG_000615900 
MAIRSFGRIAPARSLLIHFKLVTDAFHGEAPSGPYLLPQAARSLLCEKCDGKCVICDSYVRPCTLVRICDECNYGSYQGRCVICGGTGVSDAYYCRESPKPTSFTKGRNMDSKNDLISNKFTMHADVIISILKPGLFVIVDFFIV 
1

的模式是固定的長度。因此,只需在想要開始新行的列點處拆分行。例如,分割線在第40個字符:

sed -E $'s/(^.{40})/\\1\\\n/g' < file 

(注:我使用的是OS X的sed我不得不逃離與$''模式。)

相關問題