awk与嵌套if else

时间:2013-02-26 10:27:22

标签: bash awk nested-if

我有一个制表符分隔两列数据。我希望根据第二列应用的条件得到第三个。

如果第二列不等于零,则应打印col 1和3以及col1 / col2的比率 如果col 2为零且col 1超过15,则应该打印col 1和col2以及col1中的值(col 3中)else(当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

显然我做错了,请帮助我正确处理上述代码。

谢谢

4 个答案:

答案 0 :(得分: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 - &gt; else if$1 15,而非$2,然后你的oneliner也会工作。

答案 1 :(得分: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

答案 2 :(得分:1)

awk '{$3=$1>=15 && $2==0?$1:$1<15 && $2==0?0:$1/$2}1' your_file

答案 3 :(得分: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