以下に示すように、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.6e8
awkの外側のコードなどは機能しません。
0を与える
- (短縮データを含む)最初の行は条件を満たし、
maxt
0maxa
に設定されている場合、条件は満たされなくなります。
値を保存する必要はありません(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になります。