2013-02-26 113 views
0

我有一個製表符分隔兩列數據。我想根據在第二欄中應用的條件得到第三個。awk與嵌套if else

如果第二列不等於零,它應該打印第1列和第3列,並且col1/col2的比率爲 如果第2列爲零且第1列大於15,則應打印列1和列2, COL1(在COL 3)否則(COL1 <當= 15 & COL2是0)它應該打印COL1 COL2和0

例如,對於像這樣

1 2 
4 5 
6 7 
14 0 
18 0 

一個文件輸出應該是

1 2 0.5 
4 5 0.8 
6 7 0.85 
14 0 0 
18 0 18 

我曾嘗試:

awk '{if ($2!=0) print $1 "\t" $2 "\t" $1/$2; elseif($2>15) print $1 "\t" $2 "\t" $1 ; else print $1 "\t" $2 "\t" $2}'<tags| head 

很顯然,我做錯了,請幫我在得到上面的代碼的權利。

謝謝

回答

1

一個有趣但不可讀(也許):)一行代碼:

awk '{$0=$2?$1FS$2FS$1/$2:$1>15?$1FS$2FS$1:$1FS$2FS"0"}1' file 

簡短的解釋:

a=boolean? first : second 

this means assign var a, if boolean true, using value first, otherwise use value second. 

I set `$0 = $2? FOO : BAR` 
FOO part: $1 FS $2 FS $1/$2 
BAR part: $1>15? FOO2 : BAR2 
    FOO2 part: $1 FS $2 FS $1 
    BAR2 part: $1 FS $2 FS "0" 

finally, print $0 

問題在你的代碼

chang elseif - >else if還檢查$115,而不是$2然後你的oneliner也可以。

+0

請您解釋一下什麼是代碼回事... – Angelo 2013-02-26 10:37:37

+1

@Angelo解釋添加 – Kent 2013-02-26 10:42:17

+0

謝謝:)教育性 – Angelo 2013-02-26 10:43:10

1

這裏的另一種選擇:

awk '!$2 { $3 = $1>15 ? $1 : 0 } $2 { $3 = $1/$2 } 1' OFS='\t' CONVFMT='%.2g' 

輸出:

1 2 0.5 
4 5 0.8 
6 7 0.86 
14 0 0 
18 0 18 
1
awk '{$3=$1>=15 && $2==0?$1:$1<15 && $2==0?0:$1/$2}1' your_file 
1

方式略有不同:

awk '{if($2!=0) $3=$1/$2; else if($1>15) $3=$1; else $3=0}1' OFS='\t' file 

由if語句的順序確定:

awk '{$3=0} $1>15{$3=$1} $2{$3=$1/$2}1' OFS='\t' file 

或神祕版本:

awk '{$3=$2?$1/$2:$1>15?$1:0}1' OFS='\t' file