代码之家  ›  专栏  ›  技术社区  ›  Revan

bash:在前缀后减去常量

  •  2
  • Revan  · 技术社区  · 7 年前

                         /locus_tag="PREFIX_05485"
    

    包括开头的空白。不幸的是,第一个标识符不是以开头 00001 .

    这行中唯一改变的部分是数字。

    sed

                         /locus_tag="myNewPrefix_00001"
    

    (下一项应为 ..."myNewPrefix_00002" 等等)。或者,条目也可以没有前导零。

    据我所知,, 塞德 无法计算(如减去常量)。有没有办法解决这个问题?

    编辑:有时相同的数字出现两次(例如,在修改过的文件中也应如此)

                         /locus_tag="PREFIX_12345"
                         /locus_tag="PREFIX_12345"
                         /locus_tag="PREFIX_12346"
                         /locus_tag="PREFIX_12347"
    

                         /locus_tag="myNewPrefix_00001"
                         /locus_tag="myNewPrefix_00001"
                         /locus_tag="myNewPrefix_00002"
                         /locus_tag="myNewPrefix_00003"
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   anubhava    7 年前

    你可以用 awk

    awk -v pf='myNewPrefix' 'BEGIN{FS=OFS="="}
    $1 ~ /\/locus_tag$/ && split($2, a, /_/) == 2 {
       $2 = sprintf("\"%s_%05d\"", pf, (a[2] in seen ? i : ++i)); seen[a[2]]
    } 1' file
    

                     /locus_tag="myNewPrefix_00001"
                     /locus_tag="myNewPrefix_00001"
                     /locus_tag="myNewPrefix_00002"
                     /locus_tag="myNewPrefix_00003"                        
    
        2
  •  1
  •   stack0114106    7 年前

    检查这一行

    /tmp> cat littlebird.txt
    abcdef
                         /locus_tag="PREFIX_12345"
    hello hai
                         /locus_tag="PREFIX_12345"
                         /locus_tag="PREFIX_12346"
                         /locus_tag="PREFIX_12347"
    123 456
    end
    /tmp> perl -pe 'BEGIN{$r=qr/PREFIX_(.+)["]/} if(/$r/) {$kv{$1}++;$kv{$1}==1 and $kv2{$1}=sprintf("%04d",++$i) for(keys %kv) } s/$r/PREFIX_$kv2{$1}/g ' littlebird.txt
    abcdef
                         /locus_tag="PREFIX_0001
    hello hai
                         /locus_tag="PREFIX_0001
                         /locus_tag="PREFIX_0002
                         /locus_tag="PREFIX_0003
    123 456
    end
    /tmp>
    
    推荐文章