Linux
在 AWK 中使用 IF 語句
我正在編寫大腳本,我堅持這部分,如果有人可以幫助我請
這是文件範例
31:49.9,9.92,TCP ,1_19,490,EXT_SERVER,22,5,257,1,.ASF,0,normal
這是我腳本的一部分
read -p "Please input the function itself ex, > : " function read -p "Please input the value: " value
如果我這樣使用,和我一起工作得很好
cat temp | awk -F',' -v val="$value" '{if($8 > val) print $0}' > $destfile
但是當我嘗試這樣使用時
cat temp | awk -F',' -v val="$value" -v fn="$function" '{if($8 fn val) print $0}' > $destfile
謝謝
沒有多少程式語言允許在執行時根據變數的內容生成運算符。解析程式碼時,if 語句條件中的表達式必須在語法上有效,並且不是。
$*number variable variable*
(當然在 shell 和
test
/[
你可以做 eg[ "$a" "$op" "$b" ]
,但那是因為[
它是一個命令,並在 shell 擴展變數後解析它的參數。)你有一些選擇。
在 awk 解析程式碼之前,您可以讓 shell 擴展運算符,如下所示:
cat temp | awk -F',' -v val="$value" ' {if($8 '"$function"' val) print $0}' > $destfile
然後如果
$function
包含 eg<
,awk 會看到{if($8 < val) ...
。如果你這樣做,你應該$function
在執行 awk 之前驗證它是一個可接受的操作符。否則,您的使用者可能會遇到令人驚訝的語法錯誤,甚至更糟。作為另一種選擇,您可以讓使用者同時輸入下限和上限,並始終在程式碼中檢查兩者。如果使用者不想分別輸入下限/上限,則替換例如
-inf
/或其他一些足夠低/高的值。+inf
read -p "Please enter lower limit: " lo read -p "Please enter upper limit: " hi cat temp | awk -F',' -v lo="${lo:--inf}" -v hi="${hi:-+inf}" ' {if (lo <= $8 && $8 <= hi) print $0}' > $destfile
(
-inf
/+inf
似乎直接在 GNU awk 和 Busybox 中工作,mawk 似乎需要強制它們使用等號lo + 0 <= $8
)我想在 GNU awk 中,第三種選擇是為您要提供的所有不同比較運算符創建函式,然後根據變數中給出的名稱使用間接函式呼叫來呼叫其中一個。
例如對於小於和大於測試:
read -p "Please input the function (lt or gt): " op read -p "Please input the value: " value cat temp | gawk -F',' -v op="$op" -v val="$value" ' function lt(a, b) { return a < b; } function gt(a, b) { return a > b; } {if (@op($8, val)) print $0}'
這樣做的缺點當然是您必須顯式創建所有函式,並且如果使用者輸入了無效的函式名稱,他們會收到錯誤消息。