2014-05-23 49 views
0

提取值的所有
我有兩個輸入文件是這樣的:
文件1:如何從 「表樣」 的文本文件,使用awk

#W #S #this line dosen't exit 
110 170 Bias 
110 200 Bias 
110 215 Bias 
110 320 Bias 
125 170 Bias 
125 200 Bias 
125 215 Bias 
125 320 Bias 
135 170 Bias 
135 200 Bias 
135 215 Bias 
135 320 Bias 
140 170 Bias 
140 200 Bias 
140 215 Bias 
140 320 Bias 

文件2:

FUNCTION BIAS (W, S) 
Bias = 0 
IF AND (W >= 0, W < 120) THEN 
    IF (S >= 0) THEN Bias = -1 
    IF (S >= 180) THEN Bias = -2 
    IF (S >= 190) THEN Bias = -3 
    IF (S >= 200) THEN Bias = -4 
    IF (S >= 210) THEN Bias = -5 
    IF (S >= 220) THEN Bias = -6 
    IF (S >= 240) THEN Bias = -7 
ENDIF 

IF AND (W >= 120, W < 130) THEN 
    IF (S >= 0) THEN Bias = -11 
    IF (S >= 180) THEN Bias = -12 
    IF (S >= 190) THEN Bias = -13 
    IF (S >= 200) THEN Bias = -14 
    IF (S >= 210) THEN Bias = -15 
    IF (S >= 220) THEN Bias = -16 
    IF (S >= 240) THEN Bias = -17 
ENDIF 

IF AND (W >= 130, W < 140) THEN 
    IF (S >= 0) THEN Bias = 1 
    IF (S >= 180) THEN Bias = 2 
    IF (S >= 190) THEN Bias = 3 
    IF (S >= 200) THEN Bias = 4 
    IF (S >= 210) THEN Bias = 5 
    IF (S >= 220) THEN Bias = 6 
    IF (S >= 240) THEN Bias = 7 
ENDIF 

IF (W >= 140) THEN 
    IF (S >= 0) THEN Bias = 11 
    IF (S >= 180) THEN Bias = 12 
    IF (S >= 190) THEN Bias = 13 
    IF (S >= 200) THEN Bias = 14 
    IF (S >= 210) THEN Bias = 15 
    IF (S >= 220) THEN Bias = 16 
    IF (S >= 240) THEN Bias = 17 
ENDIF 

RETURN (Bias) 

什麼我想要做的是找出數學函數的相應值:來自file1的輸入(W,S)對的「BIAS(W,S)」

例如:W/S = 135/195, 「W」 滿足

IF AND (W >= 130, W < 140) 

所以我們會去查 「S」

IF (S >= 0) THEN Bias = 1 
    IF (S >= 180) THEN Bias = 2 
    IF (S >= 190) THEN Bias = 3 
    IF (S >= 200) THEN Bias = 4 
    IF (S >= 210) THEN Bias = 5 
    IF (S >= 220) THEN Bias = 6 
    IF (S >= 240) THEN Bias = 7 

然後最後我們可以看出S = 195之間190和200,BIAS的(W,S)的值是3

我想要的輸出是這樣的:

110 170 Bias -1 
110 200 Bias -4 
110 215 Bias -5 
110 320 Bias -7 
125 170 Bias -11 
125 200 Bias -14 
125 215 Bias -15 
125 320 Bias -17 
135 170 Bias 1 
135 200 Bias 4 
135 215 Bias 5 
135 320 Bias 7 
140 170 Bias 11 
140 200 Bias 14 
140 215 Bias 15 
140 320 Bias 17 

這很容易被人的眼睛檢查 但正如你所看到的,file2基本上是一個文本文件,而不是一個普通的2D數組文件,我如何提取相應的值?任何提示?

+2

把你的file2轉換成awk函數,它已經接近了,然後用這個函數檢查file1。它比解析file2更容易,並且提取事物並檢查。 – Kent

+0

謝謝@Kent,我花了很多時間來弄清楚如何解析file2,你的意見有很大幫助! – liltme

回答

1

運行下面的腳本tst.awk的 「文件2」 來將腳本以awk的任何語言轉換並將其輸出保存爲新的f ILE名爲「getbias.awk」,然後運行:

awk -f getbias.awk '<your script>' file1 

其中<your script>解析文件1,並調用下面生成getbias()函數來獲取偏差值的每一行。

$ cat tst.awk 
{ 
    sub(/BIAS/,"getbias") 
    sub(/ENDIF/,"}") 
    sub(/ THEN/,"") 
    $0 = tolower($0) 
} 
/^function/ { sub(/\)/,",\tbias)"); $0 = $0 " {" } 
/^return/ { $0 = $0 ORS "}" } 
/^if/  { sub(/ and/,""); sub(/,/," \\&\\&"); $0 = $0 " {" } 
{ print } 

$ awk -f tst.awk file2 
function getbias (w, s ,  bias) { 
bias = 0 
if (w >= 0 && w < 120) { 
    if (s >= 0) bias = -1 
    if (s >= 180) bias = -2 
    if (s >= 190) bias = -3 
    if (s >= 200) bias = -4 
    if (s >= 210) bias = -5 
    if (s >= 220) bias = -6 
    if (s >= 240) bias = -7 
} 

if (w >= 120 && w < 130) { 
    if (s >= 0) bias = -11 
    if (s >= 180) bias = -12 
    if (s >= 190) bias = -13 
    if (s >= 200) bias = -14 
    if (s >= 210) bias = -15 
    if (s >= 220) bias = -16 
    if (s >= 240) bias = -17 
} 

if (w >= 130 && w < 140) { 
    if (s >= 0) bias = 1 
    if (s >= 180) bias = 2 
    if (s >= 190) bias = 3 
    if (s >= 200) bias = 4 
    if (s >= 210) bias = 5 
    if (s >= 220) bias = 6 
    if (s >= 240) bias = 7 
} 

if (w >= 140) { 
    if (s >= 0) bias = 11 
    if (s >= 180) bias = 12 
    if (s >= 190) bias = 13 
    if (s >= 200) bias = 14 
    if (s >= 210) bias = 15 
    if (s >= 220) bias = 16 
    if (s >= 240) bias = 17 
} 

return (bias) 
} 
+0

謝謝,我修改你的tst.awk一點點來製作劇本。@Tiago的awk然後使用:'awk -f script.awk'來獲得正確的結果,你會介意更多的關於函數調用awk的解釋(我剛開始幾個星期就開始學習awk,不知道怎麼去使用'') – liltme

+0

用'{print $ 0,getbias($ 1,$ 2)}替換'' –

3

我只是轉換你的邏輯爲AWK:

script.awk:

{ 
    w=$1; 
    s=$2; 

    if (w >= 0 && w < 120) { 
     if (s >= 0) { bias= -1 } 
     if (s >= 180) { bias= -2 } 
     if (s >= 190) { bias= -3 } 
     if (s >= 200) { bias= -4 } 
     if (s >= 210) { bias= -5 } 
     if (s >= 220) { bias= -6 } 
     if (s >= 240) { bias= -7 } 
    } 

    if (w >= 120 && w < 130) { 
     if (s >= 0) { bias= -11 } 
     if (s >= 180) { bias= -12 } 
     if (s >= 190) { bias= -13 } 
     if (s >= 200) { bias= -14 } 
     if (s >= 210) { bias= -15 } 
     if (s >= 220) { bias= -16 } 
     if (s >= 240) { bias= -17 } 
    } 

    if (w >= 130 && w < 140) { 
     if (s >= 0) { bias= 1 } 
     if (s >= 180) { bias= 2 } 
     if (s >= 190) { bias= 3 } 
     if (s >= 200) { bias= 4 } 
     if (s >= 210) { bias= 5 } 
     if (s >= 220) { bias= 6 } 
     if (s >= 240) { bias= 7 } 
    } 

    if (w >= 140) { 
     if (s >= 0) { bias= 11 } 
     if (s >= 180) { bias= 12 } 
     if (s >= 190) { bias= 13 } 
     if (s >= 200) { bias= 14 } 
     if (s >= 210) { bias= 15 } 
     if (s >= 220) { bias= 16 } 
     if (s >= 240) { bias= 17 } 
    } 

    print $0" "bias; 

} 

執行:

awk -f script.awk file1 
110 170 Bias -1 
110 200 Bias -4 
110 215 Bias -5 
110 320 Bias -7 
125 170 Bias -11 
125 200 Bias -14 
125 215 Bias -15 
125 320 Bias -17 
135 170 Bias 1 
135 200 Bias 4 
135 215 Bias 5 
135 320 Bias 7 
140 170 Bias 11 
140 200 Bias 14 
140 215 Bias 15 
140 320 Bias 17 
+2

與大多數語言一樣,awk具有'else'語句,因此您無需在每個成功的if語句中檢查前一個條件的否定。因此,如果(w> = 0 && w <120){x}如果(w> = 120 && w <130){y}'你可以做'if(w> = 0 && w <120){ x} else if(w <130){y}' –

+0

@Tiago謝謝,其實file2是某種語言需要在excution之前編譯的,所以我得到的是包含數千行實際情況的格式,儘管我也覺得這很愚蠢 – liltme