我有一个大型文本文件,其中包含许多这样的条目:
/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"
答案 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>