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

答え2

はい、わかりました。

あなたは次のようなものが欲しい

awk -v maxt=0.05 '{t6 = $6 * 3.6e8 ;
        if(t6<=maxt){maxt=$1; maxa=$1}}
     END{print maxa ;}' data

ファイルから得られた値を乗算するには、awkの内側にある必要があるため、v6="$arg6"*3.6e8awkの外側のコードなどは機能しません。

0を与える

  • (短縮データを含む)最初の行は条件を満たし、maxt0maxaに設定されている場合、条件は満たされなくなります。

値を保存する必要はありません(awkで他の計算を行わない限り)。

awk -v maxt=0.05 '$6 * 3.6e8 <= maxt {print $1 ; exit ;}' data

どこ

  • -v maxt=0.05 割り当てmaxt
  • $6 * 3.6e8 <= maxt成功条件をテストする前{(awkでは「パターン」と呼ばれる)
  • {print $1 ; exit ;}見つかった値を印刷して終了します。 (これをawkでは「アクション」といいます)

新しいデータを使用すると1.5になります。

関連情報