2012-05-21 37 views
0

我有一個文件,其中包含基因名稱,如g1,g2,g3,g1.t1,g2.t1,g3 .t1 ...,我需要在「g」旁邊的每個數字上添加100爲g101,g102,g103,g101.t1,g102.t1,g103.t1 ... 以下是文件通過向文件中添加數字(100)來替換字符串(如g1)

中的一些行

起始基因g1

Chr1 AUGUSTUS基因3656 5929 0.1 +。 g1 Chr1 AUGUSTUS轉錄本3656 5929 0.1 +。 g1.t1 Chr1 AUGUSTUS tss 3656 3656。 +。 transcript_id「g1.t1」; gene_id「g1」; Chr1 AUGUSTUS外顯子3656 3926。 +。 transcript_id「g1.t1」; gene_id「g1」;

我需要使用sed命令以更新的值替換文件中的所有g1,g2 ...。 有沒有人有想法?

最佳,

回答

0

這是醜陋的,我敢肯定,有更優雅的解決方案,但這裏的東西開始。

sed -i -e "s/[g]\([0-9]\)/g10\1/g" file 

我正在尋找做與sed的實際算術,這似乎是不理想的。我會建議看看awk。

0

這適用於提供的測試數據。如果同一行中有幾個基因名稱,即g1和g10,可能會出現錯誤,但看起來並非如此。

gawk '{match($0,"g[0-9]+",ary);i=0;while(length(ary[i])>0){ gsub(ary[i],"g"(int(substr(ary[i],2))+100));i+=1}; print $0}' file 

回報:

啓動基因G101

CHR1 AUGUSTUS基因3656 5929 0.1 +。 g101 Chr1 AUGUSTUS轉錄本3656 5929 0.1 +。 g101.t1 Chr1 AUGUSTUS tss 3656 3656。 +。 transcript_id「g101.t1」; gene_id「g101」; Chr1 AUGUSTUS外顯子3656 3926。 +。 transcript_id「g101.t1」; gene_id「g101」;

0
snafu$ touch g1 g2 g3 g1.t1 g2.t1 g3.t1 
snafu$ prename -v 's/g(\d+)/sprintf("g%03d",$1+100)/e' g* 
g1 renamed as g101 
g1.t1 renamed as g101.t1 
g2 renamed as g102 
g2.t1 renamed as g102.t1 
g3 renamed as g103 
g3.t1 renamed as g103.t1 

-n是一個幹運行 - 它會告訴你提議的重命名而不執行。

prename包含在perl中。

0

一個使用perl方式:

perl -pe 's/g(\d+)/"g".($1+100)/ge' file 

結果:

start gene  g101 
Chr1 AUGUSTUS gene  3656 5929 0.1 + . g101 
Chr1 AUGUSTUS transcript 3656 5929 0.1 + . g101.t1 
Chr1 AUGUSTUS tss   3656 3656 . + . transcript_id "g101.t1"; gene_id "g101"; 
Chr1 AUGUSTUS exon  3656 3926 . + . transcript_id "g101.t1"; gene_id "g101"; 
相關問題