0

我有一个文件,其中包含基因名称,如 g1、g2、g3、g1.t1、g2.t1、g3.t1 ...,我需要在“g”旁边的每个数字上加 100 为 g101、g102、g103, g101.t1, g102.t1, g103.t1 ... 下面是文件中的一些行

起始基因g1

Chr1 AUGUSTUS 基因 3656 5929 0.1 + . g1 Chr1 AUGUSTUS 成绩单 3656 5929 0.1 + . g1.t1 Chr1 AUGUSTUS tss 3656 3656。+ . 成绩单ID“g1.t1”;基因ID“g1”;Chr1 AUGUSTUS 外显子 3656 3926。+ . 成绩单ID“g1.t1”;基因ID“g1”;

我需要使用 sed 命令将文件中的所有 g1、g2、.. 替换为更新后的值。有人有想法吗?

最好的,

4

4 回答 4

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 回答
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 是一个试运行——它会在不执行的情况下向您显示建议的重命名。

perl 中包含 prename。

于 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 回答