次の形式の複数の図面ファイルがあります。この行の後のファイル領域で数値を増やす必要があります。悪。 14.00のすべての値(以下の例)は1から15.00に増加する必要があります。この場合、次の5行は悪15時になります。$4+1
値が増加することがわかりますが、小数点以下の2桁がありません。
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
スクリプトは、で始まる行に達するまで入力を出力にパイプしてから1にBO
設定する以外は何もしません。flag
1 で現在の行に 4 つの列が含まれている場合、4 番目の列が使用され、書式がflag
再指定されます。書式仕様は、「小数点2桁の浮動小数点値」を意味します。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