行識別子の後の列を変更するには、gawk を使用します。

行識別子の後の列を変更するには、gawk を使用します。

次の形式の複数の図面ファイルがあります。この行の後のファイル領域で数値を増やす必要があります。。 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

おすすめ記事