bash:在前缀后减去常数

时间:2018-12-07 14:36:22

标签: bash

我有一个大型文本文件,其中包含许多这样的条目:

                     /locus_tag="PREFIX_05485"

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

此行中唯一更改的部分是数字。

我想更改PREFIX(我可以使用sed轻松地做到这一点),但我也想减少数量,使其看起来像这样:

                     /locus_tag="myNewPrefix_00001"

(下一个条目应为..."myNewPrefix_00002",依此类推)。或者,该条目也可以不带前导零。

据我所知,sed无法计算(就像减去常数一样)。有什么想法可以解决吗?

非常感谢。如果问题不清楚,请告诉我,我会尽力改善。

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

                     /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 个答案:

答案 0 :(得分:1)

您可以使用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"                        

答案 1 :(得分:1)

检查此Perl衬板

/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>