首页 > 解决方案 > 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"

标签: bash

解决方案


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

推荐阅读