2019年5月21日 星期二

awk篩選科學記號的欄位

awk可以根據資料裡面某欄位的數值大小來做篩選,但要注意要數值若是用科學記號的話,要小心不要讓awk把數值當成字串來處理。這篇文章比較下面四個指令:
  1. awk '$2 < "1E-10" {print}' input_file
  2. awk '$2 < 1E-10 {print}' input_file
  3. awk '($2+0) < 1E-10 {print}' input_file
  4. awk '($2+0) < 1E-10 && $2 != "NA" {print}' input_file
輸入的檔案請看文章後半部,這邊先說明指令的差別:
  1. "1E-10"會將科學記號看成字串,結果會有問題
  2. 一樣會有些結果沒有篩選到
  3. 答案會是正確的,使用括號會把($2+0)強制轉成數值
  4. 答案是正確的,也順便把NA刪除

下面是測試用的資料
$ cat > input_file << _EOF_
data1 0.05
data2 1e-14
data3 1e-330
data4 NA
data5 1e-14
data6 2e-60
data7 2e-150
data8 NA
data9 4e-9
_EOF_
使用awk指令處理後的結果,使用的作業系統是macOS Mojave 10.14.4
$ awk '$2 < "1E-10" {print}' input_file
data1 0.05

$ awk '$2 < 1E-10 {print}' input_file
data2 1e-14
data5 1e-14
data6 2e-60
data7 2e-150

$ awk '($2+0) < 1E-10 {print}' input_file
data2 1e-14
data3 1e-330
data4 NA
data5 1e-14
data6 2e-60
data7 2e-150
data8 NA

$ awk '($2+0) < 1E-10 && $2 != "NA" {print}' input_file
data2 1e-14
data3 1e-330
data5 1e-14
data6 2e-60
data7 2e-150


參考資料

_EOF_

沒有留言:

張貼留言