2014-11-21 38 views
1

我想編寫一個包裝腳本,它需要一個小數字,例如1e-3,並將其用作選擇某些數據行的截止點。將小數字傳入awk內部shell不起作用

假設我有一個input.txt中

region p-value 
brain 0.009 
breast 0.001 
liver 1e-7 
skin 1e-6 

我想用一個p值小於1e-5這是從我的玩具例如肝臟和皮膚較小的選擇區域。

我的劇本目前看起來像select.sh

#!/bin/bash 
file=$1 
column=$2 
cutoff=$3 

awk -v a="$column" -v b="$cutoff" '{ if (a < b) print}' $file > $file'.'$cutoff 

我會像這樣運行:

bash select.sh input.txt 2 1e-5 

這不工作...但是,如果我直接鍵入終端AWK線, 有用。

awk '{if ($2 < 1e-5) print}' input.txt > input.1e-5 

所以我知道這可能是awk在shell環境中的一些東西,我不知道。有誰知道如何解決它?

更新:我試圖通過0.00001進入命令,它也沒有工作。

謝謝!

+3

' 「$文件$截止」'會比'$文件更好$ cutoff',這將打破很糟糕,如果任一名稱包含通配符,空格,IFS當前值中包含的字符等。 – 2014-11-21 17:08:39

+1

我明白了。謝謝,將會使用「$ file。$ cutoff」 – olala 2014-11-21 17:13:28

回答

5

你在if (a<b)的電話中缺少$:如果你想參考列號a,你必須說$a

只要做到:

awk -v a="$column" -v b="$cutoff" '{ if ($a < b) print}' $file > $file'.'$cutoff 
             ^

或者更短: ''

awk -v a="$column" -v b="$cutoff" '$a < b' "$file" > "$file.$cutoff" 
                ^^^^^^^^^^^^^^^ 
            Charles Duffy's security check 
+0

我不確定我是否知道awk足夠好以適應這種情況 - 爲什麼需要引用'a'而不是'b'的'$'? – 2014-11-21 17:09:24

+1

這裏的關鍵是'a'包含數字,並且您需要該字段中的值。所以你需要'$ a'來獲得。同樣的理由你需要'$ 2'而不是'2'或'$ NF'與'NF'。 – 2014-11-21 17:09:41

+2

由於'$ a'是指字段編號'a',而'b'是我們比較該值的變量。即:awk的列被命名爲'$ 1','$ 2',...,而awk的變量沒有前導'$'。 – fedorqui 2014-11-21 17:10:25