0

g1、g2、g3、g1.t1、g2.t1、g3.t1 ...のような遺伝子名を含むファイルがあります。「g」の横の各番号に100を追加して、g101、g102、g103、 g101.t1、g102.t1、g103.t1...以下はファイルからのいくつかの行です

遺伝子g1を開始

Chr1AUGUSTUS遺伝子365659290.1+。g1Chr1AUGUSTUSトランスクリプト365659290.1+。g1.t1 Chr1 AUGUSTUS tss36563656。+。transcript_id "g1.t1"; gene_id "g1"; Chr1AUGUSTUSエクソン36563926。+。transcript_id "g1.t1"; gene_id "g1";

sedコマンドを使用して、ファイル内のすべてのg1、g2、..を更新された値に置き換える必要があります。誰かアイデアがありますか?

一番、

4

4 に答える 4

0

それは醜く、もっとエレガントな解決策があると確信していますが、ここから始めましょう。

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

私は理想的とは言えないsedで実際の算術演算を行うことを検討しています。awkを調べることをお勧めします。

于 2012-05-21T15:32:22.653 に答える
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 に含まれています。

于 2012-12-20T04:57:24.983 に答える
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 . + . トランスクリプト_id "g101.t1"; 遺伝子_id "g101"; Chr1 AUGUSTUS エクソン 3656 3926 。+ . トランスクリプト_id "g101.t1"; 遺伝子_id "g101";

于 2012-05-29T13:01:23.197 に答える
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";
于 2012-12-20T15:06:10.390 に答える