awkを使用して為替レート/「デリバティブ」を計算する

awkを使用して為替レート/「デリバティブ」を計算する

awkここで初心者です。

2つのデータ列があり、delta(y)/ delta(x)として提供される成長率を計算するとします。awkスクリプトでこれをどのように実行しますか?これまでに学んだことは、1行ずつ作業するだけで、複数行を処理する方法がわかりません。

注:N個のデータポイントがあると仮定すると、N-1個の勾配/速度値が得られます。

例:

  • 入力する

    x y 
    2 4 
    3 5 
    4 7
    
  • 出力

    Slope
    -
    1
    2
    

これがawk最善の選択ですか?それとも他のツールが良いですか?

ベストアンサー1

変数を使用して、ある行から次の行として記憶する必要があるデータを保存します。

出力のN + 1行は入力のN行とN + 1行に基づいて計算されるため、前の行の内容を格納するには変数が必要です。行ごとに 2 つのフィールドがあるため、各フィールドに 1 つの変数を使用します。

行1と2は特別に処理されます(ヘッダー行、データ不足)。特殊変数をテストして特定の行番号を一致させることができますNR。このディレクティブを使用するnextと、現在の行の残りの処理はスキップされます。

このプロセスは非常に簡単なので、変数を使用して前の行の内容を表すだけで十分です。現在の行を処理した後、前の行を処理するときに設定した変数を使用して、現在の行の内容を変数に保存します。

NR == 1 { print "Slope"; next; }
NR == 2 { print "-"; }
NR >= 3 { print ($2 - y) / ($1 - x) }
NR >= 2 { x = $1; y = $2; }

awkは各入力行のコードを順番に実行し、各中括弧グループの前の式はそのグループを実行するための条件なので、これは次の擬似コードと同じです。

for each line {
    NR = current line number;
    $1 = first field; $2 = second field;
    if (NR == 1) { print "Slope"; next; }
}

あるいは、前の行のデータと現在の行のデータの両方に名前を付けると、コードをより読みやすくすることができます。現在の行処理が終了すると、データは「現在」変数から「前」変数に転送されます。

NR == 1 { print "Slope"; next; }
NR == 2 { print "-"; }
NR >= 2 { current_x = $1; current_y = $2; }
NR >= 3 { print (current_y - previous_y) / (current_x - previous_x) }
NR >= 2 { previous_x = current_x; previous_y = current_y; }

おすすめ記事