次のようないくつかの行があります。
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
に対応するテキストがないため、置換は必要ありません。