2013-02-26 84 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