awk:特定のフィールドで操作が機能しません

awk:特定のフィールドで操作が機能しません

次のようないくつかの行があります。

N2O       + M       = N2       + O     + M          1.300E+11  0.00  59620.0

最後から3番目のフィールドを一緒に機能しない要素に置き換える必要がありますawk。ただし、最後のフィールドまたは最後のフィールドの2番目のフィールドに同じ式を適用すると機能します。科学的表記法とそれぞれを使ってテストしましたが、うまくいきますawk。例は次のとおりです。

#works as expected; last field gets multiplied by -1
echo "N2O       + M       = N2       + O     + M          1.300E+11  0.00  59620.0" | awk '{gsub($(NF),-1.0*$(NF))};{print}'
N2O       + M       = N2       + O     + M          1.300E+11  0.00  -59620

#does not work; third from last field stays unchanged
echo "N2O       + M       = N2       + O     + M          1.300E+11  0.00  59620.0" | awk '{gsub($(NF-2),-1.0*$(NF-2))};{print}'
N2O       + M       = N2       + O     + M          1.300E+11  0.00  59620.0

なぜこれが起こるのかという提案がありますか?

ベストアンサー1

答えは以下にあります。人間のawk:

置換で数値式を文字列に変換表現とともにsprintf(CONVFMT, expr)、そうでない場合表現ホストシステムで正確な整数で表される次のsprintf("%d", expr)
破片()sprintf(3)の機能をコピーするAWK組み込み関数です。畳み込みFMTは、数値を文字列に内部変換するために使用される組み込み変数で、で初期化されます"%.6g"

gsubしたがって、文字列操作を使用する関数を呼び出すとアッフィールドは変換されますが、sprintf("%d", 1.300E+11)130000000000に対応するテキストがないため、置換は必要ありません。

おすすめ記事