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; }