Text-Processing
用 awk 計算利率/“導數”
awk
新手在這裡。假設我有兩列數據,我想計算由 delta(y)/delta(x) 給出的增長率。我將如何在
awk
腳本中執行此操作?到目前為止,我所學到的僅涉及逐行操作,我不確定如何處理多行。注意:假設我有 N 個數據點,我會得到 N-1 個斜率/速率值。
例子:
- 輸入
x y 2 4 3 5 4 7
- 輸出
Slope - 1 2
這裡是
awk
最好的選擇嗎?還是其他一些工具更好?
使用變數來儲存您需要從一行到下一行記住的數據。
輸出中的第 N+1 行是根據輸入中的第 N 和 N+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; }