使用sed添加数字,同时保持所有其他变量不变

时间:2017-07-22 16:18:56

标签: awk sed

我一直在尝试在我的文件中添加一个数字,以便我的所有CHRM都有三个数字:

Original Data
scaffold1.1|size30980855
scaffold10.1|size30980855


Output Data
scaffold001.1|size30980855
scaffold010.1|size30980855

正如您所看到的,我正在尝试使我的数值由三位数代码组成。我在考虑使用sed,但我不知道如何保持数字在另一边......这是我的意思的一个例子

sed 's/scaffold[0-9]*/scaffold00[0-9]*/g'

我在第二个括号中放置什么来保留最初的数字。

任何建议都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

如果perl没问题

$ perl -pe 's/scaffold\K\d+/sprintf "%03d", $&/e' ip.txt 
scaffold001.1|size30980855
scaffold010.1|size30980855
  • scaffold\K\d+匹配前面有scaffold
  • 的数字
  • /e以便我们可以在替换部分中使用Perl代码
  • sprintf "%03d", $&将匹配的数字打印为3个字符宽的整数和零填充


使用sed使用捕获组:

$ sed -E 's/(scaffold)([0-9]\.)/\10\2/; s/(scaffold)([0-9]{2}\.)/\10\2/' ip.txt 
scaffold001.1|size30980855
scaffold010.1|size30980855

对于给定的问题,只需要更改两种情况

  • scaffold后跟单个数字,.需要添加两个零
  • scaffold后跟两位数,.需要添加单个零
  • s/(scaffold)([0-9]\.)/\10\2/将为第一个案例添加一个零,然后成为第二个案例
  • s/(scaffold)([0-9]{2}\.)/\10\2/将添加另一个零