Text-Processing

用 awk 計算利率/“導數”

  • July 17, 2020

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

引用自:https://unix.stackexchange.com/questions/591629