awk、列の値を掛け、定数と比較して終了する前に、最初の一致を探します。

awk、列の値を掛け、定数と比較して終了する前に、最初の一致を探します。

以下に示すように、6つのデータ列を持つdata2process.tempdataファイルがあります。

# Angle(deg)    D1      D2          D3          D4          D5
0.50    0.00E+00    0.00E+00    1.97E-10    3.94E-09    1.97E-10
1.00    0.00E+00    0.00E+00    1.70E-10    3.41E-09    1.70E-10
1.50    0.00E+00    0.00E+00    1.30E-10    2.59E-09    1.30E-10
2.00    0.00E+00    0.00E+00    9.49E-11    1.90E-09    9.49E-11
2.50    0.00E+00    0.00E+00    6.99E-11    1.40E-09    6.99E-11
3.00    0.00E+00    0.00E+00    5.27E-11    1.05E-09    5.27E-11
3.50    0.00E+00    0.00E+00    4.12E-11    8.23E-10    4.12E-11
4.00    0.00E+00    0.00E+00    3.33E-11    6.66E-10    3.33E-11
4.50    0.00E+00    0.00E+00    2.78E-11    5.56E-10    2.78E-11
5.00    0.00E+00    0.00E+00    2.37E-11    4.74E-10    2.37E-11

6番目の列(D5)に3.6E8を掛け、積が0.05以下の最初のインスタンスを探したいと思います。この時点で、最初の列にその値を保存して印刷してから終了しようとしています。上記の(編集された)データでは、最初のインスタンスは1.5度(1.3e-10 * 3.6e8 = 0.0468)で条件が満たされていますが、それ以降も同様です。したがって、echo $ maxangleは、条件を満たす最後のエントリである5.0ではなく1.5でなければなりません。

awkバージョンはGNU Awk 5.0.1、API:2.0(GNU MPFR 4.0.2、GNU MP 6.2.0)です。

次のawkコマンドを使用しようとしています。

maxangle=$(awk -v maxt=0.05; $6 *=3.6e8 '{if($6<=maxt){maxt=$6; maxa=$1}}END{print maxa ; exit} ' data2process.tempdata)

エラーが発生します。 *=3.6e8: command not found

maxangle=$(awk -v maxt=0.05 v6="$arg6"*3.6e8 '{if($v6<maxt){maxt=$1; maxa=$1}}END{print maxa ; exit} ' data2process.tempdata)

与えられたv6=*3.6e8 syntax error

maxangle=$(awk -v maxt=0.05 '{$6 = $6 * 3.6e8 ; if($6<=maxt){maxt=$1; maxa=$1}}  END{print maxa ;}' data2process.tempdata)
        echo $maxangle

5.0ください。

助けてくれてありがとう。私はそれらをすべて使用できると確信しています。

ベストアンサー1

0.05定数を3.6E8で割ると、6番フィールドと直接比較できる値が出ます。これにより、非常に大きな値と非常に小さい値を比較するときの数値アンダーフローや精度の損失の可能性を防ぎます。

awk -v maxt=0.05 '
    BEGIN { tdash = maxt / 3.6E8 }
    NR>1 && $6 < tdash { print $1; exit }
' data2process.tempdata

おすすめ記事