Linux

在 AWK 中使用 IF 語句

  • May 13, 2021

我正在編寫大腳本,我堅持這部分,如果有人可以幫助我請

這是文件範例

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

這樣做的缺點當然是您必須顯式創建所有函式,並且如果使用者輸入了無效的函式名稱,他們會收到錯誤消息。

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