使用AWK增加数字

时间:2015-01-06 13:06:12

标签: bash awk

我有一系列具有以下模式的代码块:

<div class="label label-primary">#1</div>
<!--A1_START-->

  [code block]

<!--A1_END-->

块编号为1-44。然而,块#6已被删除,因此我需要减少块7-44中的数值。

如何使用awk修改相应的块?这里有几十个类似的问题,但我似乎无法修改它们中的任何一个来产生预期的结果。

1 个答案:

答案 0 :(得分:5)

您可以使用“奇怪的”字段分隔符,这样数字就可以单独存在并准备好进行更改:

awk -v FS='<div class="label label-primary">#|</div>' '$2>7{sub($2, $2-1)}1' a

解释

  • -v FS='<div class="label label-primary">#|</div>将字段分隔符设置为<div class="label label-primary">#</div>。这样,数字将是字段2($2)。
  • $2>7{sub($2, $2-1)}以防$2大于7,然后将其替换为自己减去1。
  • 1因为它被评估为True,它会执行默认的awk操作:打印当前记录(行)。

测试

$ cat a
<div class="label label-primary">#1</div>
<!--A1_START-->

  [code block]

<!--A1_END-->

<div class="label label-primary">#2</div>
<!--A1_START-->

  [code block]

<!--A1_END-->

<div class="label label-primary">#10</div>
<!--A1_START-->

  [code block]

<!--A1_END-->

让我们运行它:

$ awk -v FS='<div class="label label-primary">#|</div>' '$2>7{sub($2, $2-1)}1' a
<div class="label label-primary">#1</div>
<!--A1_START-->

  [code block]

<!--A1_END-->

<div class="label label-primary">#2</div>
<!--A1_START-->

  [code block]

<!--A1_END-->

<div class="label label-primary">#9</div>  # <--- 10 is now 9
<!--A1_START-->

  [code block]

<!--A1_END-->