使用 gawk 更改行标识符后面的列

使用 gawk 更改行标识符后面的列

我有多个绘图文件,格式如下。我需要增加该行之后文件区域中的数字值。所有 14.00 的值(在下面的示例中)都需要增加 1 到 15.00。在这种情况下,下面的 5 行将变为 15:00。我可以看到这$4+1会增加该值,但是缺少两位小数。

我可以看到 gawk 允许类似 C 的表达式,所以这将是一个解决方案。我不明白的是如何检测记录并操作字段,直到EN到达了。

任何有关如何实现这一目标的建议都将受到赞赏。

谢谢。

AK
  v       0.00u      0.00       0.00       0.00       0.00       0.00       0.00
        398.56       0.00       0.00       0.00       0.00       0.00       0.00
        398.56      50.00       0.00       0.00       0.00       0.00       0.00
          0.00      50.00       0.00       0.00       0.00       0.00       0.00
          0.00       0.00       0.00       0.00       0.00       0.00       0.00
BO
  v      25.00o     18.75      14.00
  v      75.00o     18.75      14.00
  v     323.56o     18.75      14.00
  v     373.56o     18.75      14.00
EN

答案1

这可以通过使用一个非常简单的状态机来实现:

$ awk -v OFS="\t" '/^[A-Z][A-Z]/ && !/^BO/ { flag=0 } /^BO/ { flag=1 } flag == 1 && NF == 4 { $4 = sprintf("%.2f", 1+$4) } { print }' file
AK
  v       0.00u      0.00       0.00       0.00       0.00       0.00       0.00
        398.56       0.00       0.00       0.00       0.00       0.00       0.00
        398.56      50.00       0.00       0.00       0.00       0.00       0.00
          0.00      50.00       0.00       0.00       0.00       0.00       0.00
          0.00       0.00       0.00       0.00       0.00       0.00       0.00
BO
v       25.00o  18.75   15.00
v       75.00o  18.75   15.00
v       323.56o 18.75   15.00
v       373.56o 18.75   15.00
EN

该脚本什么也不做,只是将输入传递到输出,直到到达以 开头的行BO,然后设置flag为 1。

如果为 1 并且当前行包含四列,则使用和flag重新格式化第四列。格式规范的意思是“具有两位小数的浮点值”。sprintf()1+$4%.2f

BO如果在行开头发现其他内容,flag则重置为零。

已进行修改的输出行上的列之间的填充会发生更改。这是因为在输出时awk将字段拆分为空格,然后使用(此处设置为制表符)重新连接它们。OFS

要获得与输入完全相同的输出格式,您可以执行类似的操作

$ awk -v OFS="\t" '/^[A-Z][A-Z]/ && !/^BO/ { flag=0 } /^BO/ { flag=1 } flag == 1 && NF == 4 { printf("%3s %11s%10.2f %10.2f\n", $1,$2,$3,1+$4); next } { print }' file
AK
  v       0.00u      0.00       0.00       0.00       0.00       0.00       0.00
        398.56       0.00       0.00       0.00       0.00       0.00       0.00
        398.56      50.00       0.00       0.00       0.00       0.00       0.00
          0.00      50.00       0.00       0.00       0.00       0.00       0.00
          0.00       0.00       0.00       0.00       0.00       0.00       0.00
BO
  v      25.00o     18.75      15.00
  v      75.00o     18.75      15.00
  v     323.56o     18.75      15.00
  v     373.56o     18.75      15.00
EN

相关内容