我有多个绘图文件,格式如下。我需要增加该行之后文件区域中的数字值博。所有 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